为什么我们不能在#define预处理程序的常量之前使用#define预处理程序的常量

时间:2018-01-11 17:06:41

标签: c++

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

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

这会产生如下错误:

  

未定义的符号pi

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

1 个答案:

答案 0 :(得分:2)

因为宏是在&#34;自上而下处理&#34;方式。

[cpp.replace]

  

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

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

相关问题