2013-08-31 2 views
3

나는이 같았다 코드의 조각을 건너 몇 가지 코드를 통과하고 온 한 -"(void) temp;"는 무엇입니까? 성명?

void func(int a) 
{ 
    int temp; 
     ... 
     .... 
    temp=a; 
    (void)temp; 
} 

임시 변수가 여기서 뭘합니까? -Wall 옵션을 사용하여 컴파일하면 컴파일 오류 또는 경고가 표시되지 않습니다. 이 코드 스타일을 이해하도록 도와주세요. 감사합니다. .

+1

게시하는 실제 코드에서 '(void) temp'는 실제로 매우 이상하게 보입니다. – NPE

+0

NPE가 말한 바. 이것은 컴파일러에서 경고를하기를 원하므로 불필요한 지역을 제거 할 수있는 상황입니다. –

답변

0

컴파일러를 속여 : temp으로 가장 한 것은 사실이지만 아무 것도 수행하지 않습니다.

6

temp의 값이 달리 사용되지 않는 것을 의미하고, 최적화 컴파일러 (변수가 설정되어 있지만 사용되지 않음) 그것에 대해 경고하지만, (void)temp;을 포함하여, 당신은 (현재) 컴파일러에서 경고없이 도망. 컴파일러 경고는 물론 코드도 생성하지 않습니다. 소스 코드를 감안할 때

:

extern void func(int a); 
void func(int a) 
{ 
    int temp; 
    temp = a; 
    //(void)temp; 
} 

GCC 4.8.1 맥 OS X 10.8.4에이 코드에 대한 경고 제공 :

$ gcc -O3 -g -std=c11 -Wall -Wextra -c void.c 
void.c: In function ‘func’: 
void.c:4:8: warning: variable ‘temp’ set but not used [-Wunused-but-set-variable] 
    int temp; 
     ^
$ 

제거 주석 마커를 (그래서 (void)temp;입니다 컴파일 됨) 컴파일이 경고를 생성하지 않습니다.


이 명확하게 몇 가지 큰 맥락에서 증류 된 예제 코드 (AN SSCCE (Short, Self-Contained, Correct Example)! - 하나를 생산 주셔서 감사합니다). 코드가 나타나는 이유는 더 많거나 적습니다. 할당 된 값을 사용하는 temp으로 할당 한 후 조건부로 컴파일 된 코드가 있기 때문에 종종 발생합니다.

void func(int a) 
{ 
    int temp; 
    ... 
    temp = some_function(a); 
#if defined(SOMETHING_OR_OTHER) 
    ...do stuff with temp... 
#else 
    (void)temp; 
#endif 
} 

이 표기법은 하나의 함수 호출을 유지하지만 SOMETHING_OR_OTHER가 정의되지 않은 경우 컴파일러에서 불만을 피할 대신 함수 매개 변수의 할당되고, 그것은 종종 함수 호출의 결과가 될 것입니다.

+0

설명에 감사드립니다. – ShreshthaB

+0

gcc 버전 (우분투/Linaro 4.5.2-8ubuntu4) 4.5.2를 사용하는 내 우분투 컴퓨터에서 gcc -O3 -g -Wall -Wextra -c void.c를 시도했지만 오류나 경고를받지 못했습니다. 그래 너가 옳아. temp는 시스템 호출, 즉 write()의 리턴 값을 수집합니다. 그러나 func() 자체에는 조건부 컴파일이 없습니다. 그래도 포인터를 가져 주셔서 감사합니다. 나는 코드를 탐색하면서이를 염두에 둡니다. – ShreshthaB

+0

GCC 4.6.0에는 'set but unused'경고가 추가되었습니다. 그것은 GCC 4.5.x에 없었습니다. 나는 4.5.1, 4.5.2, 4.6.0, 4.7.0, 4.7.1, 4.8.1을 테스트 할 수 있었다. (나는 그것들의 복사본을 가지고있다. 그러나 4.4.2 인스턴스는 라이브러리가없는 버스트이다.) –

0

그것은 식 temp (단순하지만 여전히 유효한 식)을 평가 한 식의 결과 ("어떤 종류"를 의미) void에 표현의 결과를 전송하여 폐기 컴파일러 말한다.