C中是否允许空宏定义?他们的表现如何?

时间:2012-12-15 12:29:27

标签: c c-preprocessor

假设“空”宏定义

#define FOO

标准C有效吗?如果是这样,那么在定义之后FOO是什么?

3 个答案:

答案 0 :(得分:47)

它只是一个扩展到,没有任何东西的宏。但是,现在已经定义了宏,您可以查看#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_MESSAGESDEBUG_MSG(x)将扩展为print(x),您将获得Entering main。如果您移除#define,则DEBUG_MSG(x)展开为空的do - while循环,您将看不到该消息。

答案 1 :(得分:20)

是的,标准允许空定义。

  

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

答案 2 :(得分:1)

空宏定义也可用于自我文档。下面的代码段中的IN是一个示例。代码和评论均来自EDK II project

//
// 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
  );