所以,我一直在阅读GCC的文献,直到我读到第Statements and Declarations in Expressions节,第6.1,follow this link to reach the section I am talking about节.
我读到了这些奇怪的台词,GCC说
此功能在使宏定义"安全"(以便它们只对每个操作数求值一次)时特别有用.例如,在标准C中,"Maximum"函数通常被定义为宏,如下所示:
#define max(a,b) ((a) > (b) ? (a) : (b))
个但该定义计算a或b两次,如果操作数有副作用,则结果不佳.在GNU C中,如果您知道操作数的类型(这里视为int),则可以通过按如下方式定义宏来避免此问题:
#define maxint(a,b) ({int _a = (a), _b = (b); _a > _b ? _a : _b; })
个
从我的理解来看,GCC建议知道争论的类型,现在我脑子里有很多问题.
-
为什么我必须知道参数的类型?我的意思是,C宏就像文本的替代品,所以我认为
max(a,b)
可以很好地处理任何原始数据类型,无论它是整型、浮点型、双精度型等等. -
我不知道
maxint(a,b)
将如何工作,我的意思是它是一个奇怪的三元运算符签名,我的意思是例如在下面的代码行中:#include <stdio.h> #define maxint(a,b) \ ({int _a = (a), _b = (b); _a > _b ? _a : _b; }) int main() { int x = 5; int y = 10; int z = maxint(x , y); printf("z = %d",z); }
z value will be 10,这是一个正确的答案,接下来的几行是生成的行 在上述代码的编译器完成预处理之后:
int main()
{
int x = 5;
int y = 10;
int z = ({int _a = (x), _b = (y); _a > _b ? _a : _b; });
printf("z = %d",z);
return 0;
}
我的问题是在第int z = ({int _a = (x), _b = (y); _a > _b ? _a : _b; });
行,这一行如何计算z为10,我的意思是,它只是一块行,没有返回值.只有在运行时计算为时,我才会看到此行
int z = ({int _a = (5), _b = (10); 10; });
个
因为整个三元运算将被值10替换,因为(5 > 10 ? 5 : 10)将被10替换,这对我来说没有意义地将代码块分配给原始数据类型(在我的例子中是z)
- 他们在上面引用的几行中说
但是这个定义计算a或b两次.
谈到这个宏max(a,b)
,我不明白这个宏是如何计算a或b两次的,以及宏maxint(a,b)
是如何解决这个问题的?