繁体   English   中英

像C中的宏一样的功能

[英]Function like Macros in C

我试图理解像Macros这样的功能的想法,但有几点让我迷惑。 例如,我们说:

#define Max(a,b)  ((a)>(b)) ? (a):(b))

我称之为

int i = Max(4,5);

这将评估一个等于a>b的条件表达式? 如果是,则a,否则b。 但我对Max函数如何知道如何处理参数感到困惑。 与实际函数不同,实现不是在调用程序的代码中编写的。 是定义语句右边的声明为我做这个吗? 这对我来说只是一个新事物,我想确保我理解这里发生的事情。

功能的这个特殊部分就像宏一样迷惑我。 我知道这些类型的宏对于降低开销成本很有用,因为它们排除了在堆栈上节省内存的JSR RTS处理器指令。

#define Max(a,b)  ((a)>(b)) ? (a):(b))

是一个宏,除了代码中的简单文本替换之外别无其他,这意味着在预处理此行期间:

int i = Max(4,5);

变成:

int i = ((4)>(5)) ? (4):(5));

请注意,使用像这样的宏时没有类型安全性,并且在调试代码时也会非常困难。 好的经验法则是: 当你可以实现与功能相同时,不要使用宏

int max(int a, int b) {
    return (a > b) ? a : b;
}

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

int i = ((4)>(5)) ? (4):(5));

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

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

希望这会帮助你。

尝试使用gcc -E构建代码,并在编译代码之前查看代码的外观

事实上,在构建过程中,编译器会将您的实际代码转换为预处理器代码。 在预处理器阶段,编译器将c代码中的所有宏替换为其内容,并生成另一个称为预处理器代码的代码,然后编译器从预处理器代码生成目标代码

gcc -E允许您查看预处理器代码

暂无
暂无

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

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