说我有一个常数:
#define PI 3.14
假设我有一个包含多个头文件和源文件的静态库。如果我在头文件中声明它,它的范围是否适用于所有源文件?或者源文件是否需要包含声明为PI
?
答案 0 :(得分:4)
他们需要包含#define PI 3.14的文件,否则预处理器将不会读取#define行,随后编译将失败。
在C ++中,考虑编译过程的一个好方法是每个单独的C ++文件首先通过预处理器运行,该预处理器接受所有#define,#include和其他预处理器语句并在整个代码中替换它们,然后编译(此时,C ++文件和通过#include引入的任何东西几乎被视为一个非常大的单个文件),然后,链接器为所有C ++获取预处理/编译阶段的最终输出文件并将它们组装成一个最终输出文件。预处理器(处理定义)在编译阶段之前工作,而不是在链接期间工作。
答案 1 :(得分:1)
定义必须包含在每个模块中。
从技术上讲,它没有“范围”。它只是在编译之前发生的文本替换操作。您还可以查看编译器设置,以获取指定预处理器定义的方法。这通常是通过IDE轻松实现的项目设置。
答案 2 :(得分:0)
他们需要包含define,但是如果您需要跨所有文件定义,则可以执行编译器级别切换。