我想知道我们是否有一个带有 #define 的预处理器指令定义,这对于 c++ 程序中的所有 .cpp 文件来说是全局的(也适用于 c)。例如,如果我们在两个单独的文件中有这样的代码:
你好.cpp:
#include <stdio.h>
#ifdef HELLO
std::cout << "Hello, I am computer" << std::endl;
#endif
main.cpp:
#include <stdio.h>
#define HELLO
int main(){
//some other code
return 0;
}
然后我编译并运行该程序:
g++ main.cpp hello.cpp
./a.out
“你好,我是电脑”会被打印吗?
提前致谢!
我认为这已经在这里得到了很好的回答:https://stackoverflow.com/a/10513279/13438741
具体:
#define 宏是全局的,因为它们不遵循正常的 C 作用域规则。宏的文本替换将应用(几乎)在宏名称出现在 #define 之后的任何位置。 (值得注意的例外是宏名称是注释的一部分或字符串文字的一部分。)
如果您在头文件中定义宏,则 #includes 该头文件的任何文件都将继承该宏(无论是否需要),除非该文件随后使用 #undef 显式取消定义它。
因此,要回答您的问题“‘你好,我是计算机’会被打印吗?”,只有在
hello.cpp
定义之后包含 HELLO
时才会打印。