假设“空”宏定义
#define FOO
标准C有效吗?如果是这样,那么在定义之后FOO
是什么?
答案 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_MESSAGES
,DEBUG_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
);