반응형
C에서 빈 매크로 정의를 사용할 수 있습니까?그들은 어떻게 행동하나요?
"빈" 매크로 정의를 가정합니다.
#define FOO
스탠다드 C가 유효한가요?그렇다면, 무엇일까?FOO
이 정의 후에?
이것은 단순히 아무것도 아닌 것으로 확장되는 매크로입니다.단, 매크로가 정의되었으므로 에서 확인할 수 있습니다.#if defined
(또는#ifdef
정의되어 있는지 여부를 확인합니다.
#define FOO
int main(){
FOO FOO FOO
printf("Hello world");
}
로 확장됩니다.
int main(){
printf("Hello world");
}
이것이 매우 편리한 경우가 있습니다.예를 들어 릴리스 버전에서는 표시하지 않는 추가 디버깅 정보 등입니다.
/* Defined only during debug compilations: */
#define CONFIG_USE_DEBUG_MESSAGES
#ifdef CONFIG_USE_DEBUG_MESSAGES
#define DEBUG_MSG(x) print(x)
#else
#define DEBUG_MSG(x) do {} while(0)
#endif
int main(){
DEBUG_MSG("Entering main");
/* ... */
}
매크로 이후CONFIG_USE_DEBUG_MESSAGES
정의되어 있습니다.DEBUG_MSG(x)
로 확장됩니다.print(x)
그리고 당신은 얻을 것이다Entering main
를 삭제했을 경우#define
,DEBUG_MSG(x)
빈칸으로 확장하다do
-while
루프하면 메시지가 표시되지 않습니다.
예, 표준에서는 빈 정의가 허용됩니다.
C11 (n1570), § 6.10 전처리 지시
control-line: # define identifier replacement-list new-line # define identifier lparen identifier-list(opt) ) replacement-list new-line # define identifier lparen ... ) replacement-list new-line # define identifier lparen identifier-list , ... ) replacement-list new-line replacement-list: pp-tokens(opt)
일반적으로 사용되는 것은 포함 가드입니다.
#ifndef F_H
# define F_H
#endif
빈 매크로 정의는 자체 문서화에도 사용할 수 있습니다.그IN
아래 코드 스니펫은 샘플입니다.코드와 코멘트는 모두 EDK II 프로젝트에서 인용한 것입니다.
//
// Modifiers for Data Types used to self document code.
// This concept is borrowed for UEFI specification.
//
///
/// Datum is passed to the function.
///
#define IN
typedef
EFI_STATUS
(EFIAPI *EFI_BLOCK_RESET)(
IN EFI_BLOCK_IO_PROTOCOL *This,
IN BOOLEAN ExtendedVerification
);
언급URL : https://stackoverflow.com/questions/13892191/are-empty-macro-definitions-allowed-in-c-how-do-they-behave
반응형
'source' 카테고리의 다른 글
단언은 악인가? (0) | 2022.08.31 |
---|---|
Vue 2 - 스크롤 이벤트 리슨 중 (0) | 2022.08.31 |
tilde(~) 연산자의 역할은 무엇입니까? (0) | 2022.08.31 |
Vue 템플릿에서 중첩된 개체 속성에 쉽게 액세스할 수 있는 방법이 있습니까? (0) | 2022.08.30 |
Java 8의 맵 목록 (0) | 2022.08.30 |