【发布时间】:2016-07-06 15:02:28
【问题描述】:
#define 的范围是什么?
我有一个关于 C/C++ 的#define 范围的问题,我想打赌理解预处理器。
假设我有一个包含多个源文件和头文件的项目。假设我有一个包含以下内容的头文件:
// header_file.h
#ifndef __HEADER_FILE
#define __HEADER_FILE
#define CONSTANT_1 1
#define CONSTANT_2 2
#endif
假设我有两个按以下顺序编译的源文件:
// source1.c
#include header_file.h
void funct1(void)
{
int var = CONSTANT_1;
}
// source2.c
#include header_file.h
void funct2(void)
{
int var = CONSTANT_2;
}
假设我已经包含了所有其他必要的开销,这段代码应该可以正常编译。但是,我很好奇编译之间会记住什么#defines。当我编译上面的代码时,每个#include的内容是真的被包含了,还是include的守卫真的被实现了?
TLDR:#defines 是否会从一个编译单元延续到下一个编译单元?还是#define 只存在于单个编译单元中?
当我输入此内容时,我相信我正在回答我自己的问题,并且我会陈述我相信的答案。 #defines 被限制为单个编译单元 (.c)。当预处理器从一个编译单元转到下一个编译单元时,它基本上会忘记任何#defines。因此,在我列出的上面的示例中,包含守卫没有发挥作用。我的这种看法正确吗?
【问题讨论】:
-
TL/DR:
#define在每个编译单元中都是可见的,从它向下定义的点开始直到#undef-ed。
标签: c c-preprocessor