source

C에서 빈 매크로 정의를 사용할 수 있습니까?그들은 어떻게 행동하나요?

factcode 2022. 8. 31. 22:30
반응형

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

반응형