像C中的宏一样的功能

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)

  • 我实际上认为这个涉及`max()`的特殊例子是使用宏而不是函数的好时机.在没有模板或泛型的C中,你必须为每种类型编写一个单独的`max()`函数,而对于一个简单的宏,它只是Just Works(对于`>`有意义的类型). (3认同)

Gra*_*and 5

在预处理之后,编译器实际看到的是:

int i = ((4)>(5)) ? (4):(5));
Run Code Online (Sandbox Code Playgroud)

传递给宏的参数将替换为宏的主体.


Rom*_*nko 5

只是停止考虑像可编译代码这样的宏。宏是由预处理器“解析”的,实际上不是在编译阶段。因此,通过宏定义,您只需定义如何处理文本文件中的某些字符串即可。仅预处理器的输出传递到编译器。您可以使用gcc -E预处理器查看源代码。在此阶段它仍然是C代码,但没有任何预处理程序指令。

希望这会帮助你。