41 c c-preprocessor
假设"空"宏定义
#define FOO
Run Code Online (Sandbox Code Playgroud)
它是有效的标准C吗?如果是这样,FOO这个定义之后是什么?
Zet*_*eta 50
它只是一个扩展到,没有任何东西的宏.但是,现在已经定义了宏,您可以检查#if defined(或#ifdef)是否已定义宏.
#define FOO
int main(){
FOO FOO FOO
printf("Hello world");
}
Run Code Online (Sandbox Code Playgroud)
将扩大到
int main(){
printf("Hello world");
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,这非常方便,例如您不希望在发布版本中显示的其他调试信息:
/* 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");
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
由于宏CONFIG_USE_DEBUG_MESSAGES已定义,DEBUG_MSG(x)将扩展到print(x)您将获得Entering main.如果您删除#define,DEBUG_MSG(x)扩展到一个空的do- while环,你将不会看到该消息.
md5*_*md5 20
是的,标准允许空定义.
C11(n1570),第6.10节预处理指令
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26101 次 |
| 最近记录: |