为什么我们使用预处理器指令来定义变量?

Sep*_*our 5 c++ variables global-variables c-preprocessor preprocessor-directive

我有一段这样的代码:

/* T matrix */
#define T11     0
#define T12_re  1
#define T12_im  2

int main(int argc, char *argv[])
{
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么它使用预处理程序指令来定义全局变量,而不是简单地使用如下代码:

/* T matrix */
double T11 = 0;
double T12_re = 1;
double T12_im = 2;

int main(int argc, char *argv[])
{
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

Bas*_*tch 1

预处理器符号不是变量。在您的第一个代码中,T13_im(etc...) 不是变量(而是预处理的名称,4在解析时扩展为)

在你的第二个代码中(它不会像你编写的那样编译),你可能有

const double  T12_re=  1.0;
Run Code Online (Sandbox Code Playgroud)

然后你就声明了一个类型T12_re的变量const double

阅读有关C 预处理器的 wikipage和GNU cpp的文档,并意识到编译器只看到预处理的形式;对于您的文件, 您可以使用命令yoursource.cc获取预处理的表单,然后使用寻呼机或编辑器浏览生成的内部yoursource.ii
g++ -Wall -C -E yoursource.cc > yoursource.iiyoursource.ii

有时,预处理器允许像这样的可爱技巧。而且你不能总是使用变量。例如,case表达式应该是编译时常量,并且不能是 C 中的const int变量。(你可以使用 some enum,它在 C 和 C++ 中是不同的)。