C语言中无赋值的#define指令会将宏定义为什么?
原理说明
关于#define HEADERFILE_H的定义内容
C/C++ 的#define预处理指令支持无值的宏定义,你见到的这种写法属于空宏定义,仅会标记HEADERFILE_H这个宏已经处于已定义状态,没有对应的具体替换值。
这种写法是为了配合头文件包含警戒(也叫头文件保护)的逻辑工作:#ifndef HEADERFILE_H的判断规则仅校验宏是否被定义,完全不关心宏的具体内容,用空宏就能满足头文件重复包含拦截的需求,不需要额外设置替换值。
编译报错的原因
你尝试用cout<<HEADERFILE_H<<endl;输出宏的内容时,代码会先经过预处理阶段,此时HEADERFILE_H作为空宏会被直接替换为空内容,预处理完成后该行代码会变成:
cout<<<endl;
两个连续的<<中间没有合法的表达式,编译器自然会抛出error: expected expression的语法错误。
如果要验证该宏是否被定义,应该使用预处理判断指令,示例如下:
#ifdef HEADERFILE_H cout << "HEADERFILE_H 已定义" << endl; #else cout << "HEADERFILE_H 未定义" << endl; #endif
这段代码可以正常执行,因为#ifdef是预处理阶段的判断逻辑,不会把宏代入到运行时的输出逻辑中。
内容的提问来源于stack exchange,提问作者abirusabil
相关产品推荐
相关产品推荐

