2012-02-28 2 views
0

이 정의는 무엇을하며 어떻게 사용합니까?정의는 무엇을합니까?

#define UNUSED(VAR) (void)&(VAR) 

어디서나 정의가 필요합니까? 이것은 헤더에 있습니다.

편집 - 여기에 무슨 일이 일어나고 있는지 잘 모르겠다. 이 매크로가 무효화되는 거니? 변수를 무효화하지 않습니까?

+0

예, 'void'로 변환되는 매크로입니다. "변수 무효화"란 무엇을 의미합니까? –

+0

잘못된 단어, 나는 null을 의미합니다. 나는 추측한다. 예를 들어 int 인 경우 void로 캐스팅하는 것은 무엇입니까? – SirYakalot

+0

아무 것도하지 않습니다. 그것이 여기에서 사용 된 이유입니다. 이것은 "이 변수를 사용하지 마십시오"라고 말하는 명시적인 방법입니다. –

답변

1

사용하지 않는 매개 변수에 대한 경고를 컴파일러가받는 것을 방지하기위한 것입니다.

더 나은 방법은 익명으로 남겨 두는 것입니다.

void do_stuff(int x, int); 

이 경우 두 번째 매개 변수는 사용되지 않습니다. 몇 가지 과부하 목적을 위해 거기에 있어야 할 수도 있습니다.

로컬 변수에 사용하는 것과 관련하여 - 로컬 변수를 선언 한 다음 사용하지 않는 이유에 대해 스스로 물어야합니다.

그럼 대답은 코드에서 전처리기를 사용하여 변수가 항상 사용되는 방식으로 사용되는 것일 수 있습니다. 그러나 그것의 존재를 전처리하는 것이 항상 실용적이지는 않습니다.

변수를 사용하지 않는다고 선언해도 실제로 사용하면 오류가 발생하지 않습니다.

+0

익명으로 두는 데는 두 가지 문제가 있습니다. 첫째, 코드 경로 나 조건부로 컴파일 된 블록이 변수를 사용하지 않는 경우에만 작동합니다. 어떤 경우에는 익명으로 남겨두면 실패 할 수 있습니다. 둘째, 코드를 익명으로두면 코드에서 안전하게 무시되는지 여부를 결정하는 데 필요한 변수가 무엇인지 파악하기가 어렵 기 때문에 코드를 검토하기가 훨씬 더 어려워집니다. –

0

delcared되었지만 참조되지 않은 변수에 대해 불평/경고를 보내는 컴파일러를 중지하는 데 사용할 수있는 매크로입니다. 일반적으로 컴파일러 #pragma 설정을 사용하여 동일한 경고를 전역 적으로 사용하지 않도록 설정하는 것이 일반적입니다.

0

일부 변수가 사용되지 않은 경우 컴파일러에서 경고 또는 오류가 발생하는 경우입니다. 이와 같은 정의를 사용하면 상황을 점검 한 경우 이러한 경고/오류를 음소거하는 "no-op"를 삽입 할 수 있습니다. 예를 들어

는 :

void foo() 
{ 
    int x=0; 
    UNUSED(x); // don't warn me that x is not actually being used 
} 
2

는 않는 매개 변수에 대한 경고를 방지하기 위해 존재한다. 단순히 void으로 캐스팅하기 만하면됩니다. 변수를 사용하고 캐스트 은 일반적으로이 수행하지 않습니다. 나는 & 연산자가 여기에 사용 된 것만 추측 할 수 있습니다. 어쩌면 그것은 prevent a conversion operator from being called입니다. 그러나 prevent an overloaded operator& from being called은 아닙니다. 또는 변수에 대해서만 사용되도록 설정할 수도 있지만 완벽하지는 않습니다. it can be used on expressions that produce references.