如果#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](