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()
.
Can I define a Macro by setting its value equal to a function?
那不是你做的。 #define INT_MAX get_max()
只是告诉预处理器将 INT_MAX
替换为 get_max()
。预处理器不知道也不关心 get_max()
是函数调用还是其他。
我已经阅读了几篇关于预处理器指令如何在 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()
.
Can I define a Macro by setting its value equal to a function?
那不是你做的。 #define INT_MAX get_max()
只是告诉预处理器将 INT_MAX
替换为 get_max()
。预处理器不知道也不关心 get_max()
是函数调用还是其他。