[英]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.