문제

#ifndef MACROS_NULLCHECK_H_
#define MACROS_NULLCHECK_H_

#include <assert.h>

#define NULLCHECK(x) assert(x != (void *) 0);

#endif

위의 스타일을 매크로 선언을위한 템플릿으로 사용했다면 어떤 프로비 소스가 있습니까?

도움이 되었습니까?

해결책

  • 인수 주위에 괄호를 넣습니다 (표현을 통과 할 때 문제를 예방합니다)

  • 넣지 마십시오. 결국 (사용은 더 자연 스럽습니다)

    #define nullCheck (x) assert ((x)! = (void*) 0)

다른 팁

일반적으로, 당신은 항상 확장에 괄호 안에 매크로 논증을 넣어야합니다.

assert((x) != (void*) 0)

이는 당신이 통과하는 간단한 변수가 아닌 어떤 표현식도 변수 확장을 엉망으로 만들 수 있기 때문입니다.

또한 매크로 정의의 끝에 세미콜론을 넣지 않기 때문에

NULLCHECK(pSomething);

더 C와 비슷하고 나머지 코드와 일치하게 보입니다.

내가 할 수있는 한 가지 변화는 마감에 대해 언급하는 것입니다. #endif:

#endif  // MACROS_NULLCHECK_H_

그것이 무엇을 이해하는 것이 더 쉬워집니다 #endif 파일이 화면보다 길어질 때 거기에서 수행하고 있습니다.

좋은 매크로 관행 CERT C 보안 코딩 위키:

pre00-c. 기능과 같은 매크로에 인라인 또는 정적 함수를 선호합니다
pre01-c. 매개 변수 이름 주변의 매크로 내에서 괄호를 사용하십시오
pre02-c. 매크로 교체 목록은 괄호를 닫아야합니다
pre03-c. 인코딩 유형을 정의하려면 typedef를 선호합니다
Pre10-C. 다중 상태 매크로를 do-while 루프로 랩핑하십시오
Pre11-C. 세미콜론으로 단일 문장 매크로 정의를 마치지 마십시오.
Pre31-C. 할당, 증분, 감소, 휘발성 액세스 또는 기능 통화가 포함 된 인수로 안전하지 않은 매크로를 호출하지 마십시오.
Pre32-C. 매크로 인수 내부에서 전처리 지시서를 사용하지 마십시오

좋아 보인다. 내가 많이 사용하는 패턴입니다.

시행합니다 ; , 사용

#define NULLCHECK(x) do { assert((X)); } while (0)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top