2009-10-22 4 views
0

일부 사전 처리기 매크로를 선택적으로 기록하기 위해 코딩하고 싶습니다. 내가 제시로선택적 로깅을위한 전 처리기 디버그 매크로

ML_DEBUG(NSLog(@"Class dealloc: %@", [NSString stringWithCString:object_getClassName(self)])); 

코드는 잘 작동 다음하는 .m에서 .H

//#define ML_DEBUG(x) (x) // flip this bit to do the error logging 
#define ML_DEBUG(x) (1==1) // flip this bit to silence 

의 예를 들어 내가 좋아 구현합니다. 그러나 나는 "아무것도하지 말라"는 경우가 아니라는 생각을하지 않습니다. 내가 쓰는 것으로 예상했다 :

//#define ML_DEBUG(x) (x) // flip this bit to do the error logging 
#define ML_DEBUG(x) (;) // flip this bit to silence 

을 혼자 세미콜론 유효한 목표 - C 문이기 때문에,이 작동 할 것으로 예상하지만, 컴파일러는 나에게 말하고있다 :

expected expression before ';' token 

내 질문은 : 한 나는 가장 가벼운 "do nothing"문을 1==1을 사용하여 선택하거나 덜 집중적 인 방법으로이 작업을 수행합니다. 또는 임시 디버그 로깅에 대한 내 전체 접근 방식이 잘못되었습니다.

답변

4

가장 간단한 것은 빈 정의입니다 :

#define ML_DEBUG(x) 

이 대부분의 경우에 작동하지만, 삼항 연산자, 예를 들면 작동하지 않습니다

something ? ML_DEBUG(x) : ML_DEBUG(y); 

이 작동하기 위해 (실제로 고의적으로 고안된) 예를 들면 다음과 같이 할 수 있습니다.

#define ML_DEBUG(x) ((void)0) 

to void - 컴파일러는 명시 적으로 표현식의 결과를 무시한다고 말합니다.

NDEBUG 대신 빈 문으로 정의 될 때 매크로 표준 ANSI C assert()((void)0)로 전환됩니다 이러한 이유입니다.