c++ 预处理器中的 #define 变量对于程序中的所有文件来说是全局的吗?

问题描述 投票:0回答:1

我想知道我们是否有一个带有 #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

“你好,我是电脑”会被打印吗?

提前致谢!

c++ macros c-preprocessor
1个回答
0
投票

我认为这已经在这里得到了很好的回答:https://stackoverflow.com/a/10513279/13438741

具体:

#define 宏是全局的,因为它们不遵循正常的 C 作用域规则。宏的文本替换将应用(几乎)在宏名称出现在 #define 之后的任何位置。 (值得注意的例外是宏名称是注释的一部分或字符串文字的一部分。)

如果您在头文件中定义宏,则 #includes 该头文件的任何文件都将继承该宏(无论是否需要),除非该文件随后使用 #undef 显式取消定义它。

因此,要回答您的问题“‘你好,我是计算机’会被打印吗?”,只有在

hello.cpp
定义之后包含
HELLO
时才会打印。

© www.soinside.com 2019 - 2024. All rights reserved.