C++ 中的预处理器指令

Preprocessor directives in C++

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

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

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

Pre-processor 将通过文本替换来细化源代码,所以这段代码在编译阶段相当于:

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

现在我的问题是:我可以通过将宏的值设置为函数来定义宏吗? 我觉得有点奇怪,但答案是肯定的。

#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;
}   

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

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

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

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

#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 以查看预处理后的输出:

int get_max(){
    return 5;
}

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

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

Live Demo

Can I define a Macro by setting its value equal to a function?

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