繁体   English   中英

C++ 中的预处理器指令

[英]Preprocessor directives in C++

我在 C++ 中阅读了几篇关于预处理器指令如何工作的文章。我很清楚预处理器指令在编译阶段之前由预处理器管理。 让我们考虑一下这段代码:

#include <iostream>
#ifndef N
#define N 10
#endif 

int main(){
int v[N];
return 0;
}

预处理器将通过执行文本替换来详细说明源代码,因此编译阶段的这段代码相当于:

int main(){
int v[10];
return 0;
}

现在我的问题是:我可以通过将其值设置为等于 function 来定义宏吗? 这对我来说看起来有点奇怪,但答案是肯定的。

#include<iostream>
#include <limits>
#ifndef INT_MIN
#define INT_MIN std::numeric_limits<int>::min()
#endif
int get_max(){
    return 5;
}
#ifndef INT_MAX
#define INT_MAX get_max()
#endif

int main()
{
    std::cout << INT_MIN << " " << INT_MAX;
    return 0;
}   

从概念上讲,我不明白为什么这段代码有效,预处理器必须在编译阶段之前替换文本,那么如何调用 function(在本例中为 get_max()函数)?

函数调用是由编译器管理的任务? 不是吗?

预处理器如何访问std::numeric_limits::min() 这个值存在于“限制”库中,但如果我理解正确的话,库的包含是由编译器完成的。

为了说明起见,我从您的代码中删除了包含:

#ifndef INT_MIN
#define INT_MIN 0
#endif
int get_max(){
    return 5;
}
#ifndef INT_MAX
#define INT_MAX get_max()
#endif

int main()
{
    return INT_MIN + INT_MAX;
}   

然后我用-E调用 gcc 来查看预处理后的 output:

int get_max(){
    return 5;
}

int main()
{
    return 0 + get_max();
}

这是将要编译的代码。 预处理器不调用函数。 它只是将INT_MAX替换为get_max()

现场演示

我可以通过将其值设置为等于 function 来定义宏吗?

那不是你做的。 #define INT_MAX get_max()只是告诉预处理器用get_max()替换INT_MAX 预处理器不知道也不关心get_max()是 function 调用还是其他。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM