문제

일부 프리 프로세서 매크로에서 코딩하여 일부 정보를 선택적으로 기록하고 싶습니다. 예를 들어 .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

.m에서 나는 구현하고 싶다 :

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

코드는 제시 한대로 잘 작동합니다. 그러나 나는 내 "아무것도하지 않는다"는 사건이 가능한 한 가벼운 무게라고 생각하지 않습니다. 나는 다음을 쓸 것으로 예상했다.

//#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 아니면 덜 집중적 인 방법이 있습니까? 아니면 임시 디버그 로깅에 대한 나의 전체 접근 방식이 잘못된 것일까 요?

도움이 되었습니까?

해결책

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

#define ML_DEBUG(x)

이것은 대부분의 경우에 작동하지만 3 원 운영자와 함께 작동하지 않습니다.

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

이 예제를 위해 일하기 위해서는 다음을 수행 할 수 있습니다.

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

사물을 무효화하는 것이 완벽하게 유효합니다. 컴파일러에게 표현의 결과를 명시 적으로 무시하고 있다고 말합니다.

이런 이유로 표준 Ansi C 매크로 assert() 로 바뀝니다 ((void)0) 언제 NDEBUG 빈 진술 대신 정의됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top