为什么我们不能在声明之前使用预处理器 #define 常量



如果#define是一个预处理器指令,那么编译器将在实际编译之前知道该常量是什么,因为它已经定义过,但是如果我们在它之前使用,它确实会出错。这是我想要运行的代码:

#include <iostream>
using namespace std;
void sum(){
    cout<<"PI is: "<<pi;
}
#define pi 3
void main(){
    sum();
}

这会产生如下错误:

未定义的符号 pi

根据理论,(#( 语句将首先编译,因此编译器已经知道 pi 是什么。

因为宏是以"自上而下"的方式处理的。

[cpp.替换]

表单
的预处理指令
# define identifier replacement-list new-line 定义一个类似对象的宏,该宏导致宏名称的每个后续实例替换为 构成指令其余部分的预处理令牌的替换列表

它们一直持续到遇到相应的#undef,或翻译单元(源文件(的末尾,以先到者为准 (cpp.scope](

最新更新