'gnu 확장'에 해당되는 글 1건

아래 코드를 빌드하면

 
#include <stdio.h>
#include <sys/types.h>


int main(int argc, char *argv[])
{
    u_int64_t value1;
    
    value1 = 0xffffffffffffffff;
    
     return 0;
}


아래와 같이 빌드 에러 발생하게 됩니다.  


cc -Wall -Werror -Werror -std=gnu99 -c -o unused.o unused.c 
unused.c: In function ‘main’ 
unused.c:7:6: error: unused variable ‘value’ [-Werror=unused-variable] 
cc1: all warnings being treated as errors make: *** [unused.o] Error 1


이유는 ,  사용하지도 않으면서 value1 이라는 변수를 선언해 놓았기 때문인데, 보통은 Warnning 만 발생하지만 -Werror 옵션을 사용하면 기존의 Warnning 들을 모두 error 로 인식하기 때문입니다. 


가장 쉬운 해결 방법은, value1 이라는 변수를 사용하지 않는 것인데 아래와 같은 상황에서는 그렇기도 어렵습니다. 


#include <stdio.h>
#include <sys/types.h>

#define HAVE_PRINT

int main(int argc, char *argv[])
{
    u_int64_t value1;
    
    value1 = 0xffffffffffffffff;

#ifdef HAVE_PRINT
    printf("OUT : %lld\n", (long long unsigned int)value1);
#endif    
     return 0;
}

위와 같은 코드일경우, HAVE_PRINT 선언 상태에 따라서, value1 을 사용할 수도, 안할 수도 있으므로 무작정 value1 을 삭제할 수는 없습니다. 


그래서 아래와 같이 value1 에 속성을 주어서 선언하면 이런 문제를 해결할 수 있습니다. 



#include <stdio.h>
#include <sys/types.h>

#define HAVE_PRINT

int main(int argc, char *argv[])
{
    u_int64_t value1 __attribute__((unused));
    
    value1 = 0xffffffffffffffff;

#ifdef HAVE_PRINT
    printf("OUT : %lld\n", (long long unsigned int)value1);
#endif    
     return 0;
}


이렇게 하면 unused value 빌드 에러를 피할 수 있습니다. 단, 이 방법은 gnu 확장 문법이므로 다른 컴파일러 사용시에는 주의를 하셔야 합니다. 


'development' 카테고리의 다른 글

[linux] debug fs 사용법  (0) 2015.01.07
[driver] ipTime N150UA-4dBi  (8) 2014.09.16
[program] unused variable 문제  (0) 2013.08.02
[program] 32bit CPU 에서 64bit 변수 사용 문제  (0) 2013.07.25
[u-boot] RPC : sendmsg returned error 101  (0) 2013.07.19
[Kernel] Kbuild system  (0) 2013.07.12
블로그 이미지

얼굴반반피곤님 김유석0

댓글을 달아 주세요