Pre*_*esh 6 c macros c-preprocessor
我试图理解像Macros这样的功能的想法,但有几点让我迷惑.例如,我们说:
#define Max(a,b) ((a)>(b)) ? (a):(b))
Run Code Online (Sandbox Code Playgroud)
我称之为
int i = Max(4,5);
Run Code Online (Sandbox Code Playgroud)
这将评估一个等价的条件表达式a>b?如果是,则a,否则b.但我对Max函数如何知道如何处理参数感到困惑.与实际函数不同,实现不是在调用程序的代码中编写的.是定义语句右边的声明为我做这个吗?这对我来说只是一个新事物,我想确保我理解这里发生的事情.
功能的这个特殊部分就像宏一样迷惑我.我知道这些类型的宏对于降低开销成本很有用,因为它们排除了在堆栈上节省内存的JSR RTS处理器指令.
Lih*_*ihO 12
#define Max(a,b) ((a)>(b)) ? (a):(b))
Run Code Online (Sandbox Code Playgroud)
是一个宏,除了代码中的简单文本替换之外别无其他,这意味着在预处理此行期间:
int i = Max(4,5);
Run Code Online (Sandbox Code Playgroud)
变成:
int i = ((4)>(5)) ? (4):(5));
Run Code Online (Sandbox Code Playgroud)
请注意,使用像这样的宏时没有类型安全性,并且在调试代码时也会非常困难.好的经验法则是:当你可以实现与功能相同时,不要使用宏:
int max(int a, int b) {
return (a > b) ? a : b;
}
Run Code Online (Sandbox Code Playgroud)
在预处理之后,编译器实际看到的是:
int i = ((4)>(5)) ? (4):(5));
Run Code Online (Sandbox Code Playgroud)
传递给宏的参数将替换为宏的主体.
只是停止考虑像可编译代码这样的宏。宏是由预处理器“解析”的,实际上不是在编译阶段。因此,通过宏定义,您只需定义如何处理文本文件中的某些字符串即可。仅预处理器的输出传递到编译器。您可以使用gcc -E预处理器查看源代码。在此阶段它仍然是C代码,但没有任何预处理程序指令。
希望这会帮助你。