这是我的考试中提出的问题:"使用c语言的宏编写min(a,b,c)的cource代码。"
#define min(a,b,c) ((a)<(b)?((a)<(c)?(a):(c)):((b)<(c)?(b):(c)))
有更好的方法来解决min / max(x,y,z)问题吗?
答案 0 :(得分:3)
您的解决方案以及所有基于宏的便携式解决方案都是为什么应尽可能限制使用宏的一个很好的理由。如今,我几乎只使用它们而不是条件编译。
在定义常量方面,你最好使用枚举。
就类似函数的宏而言,你最好使用你可以建议编译器内联的函数,或者只是依靠编译器来解决这个问题(他们通常很擅长这一点) )。
函数式宏是一个坏主意的原因是因为,简单的文本替换,序列:
#define mymax(a, b) (a) > (b) ? (a) : (b)
int x = mymax(y++, complexFunction());
实际上会评估y++
和/或多次调用complexFunction()
,真正的函数不会做的事情。
如果您了解其局限性,请务必使用它们。我,我将依靠编译器为函数做正确的事情,这样我就不必担心C的暗角: - )
答案 1 :(得分:2)
是。写功能。
int min2( int x, int y ) { return x < y ? x : y; }
int min3( int x, int y, int z ) { return min2( x, min2( y, z ) ); }
如果您希望漂亮,可以编写一些可变参数宏,根据参数的数量选择正确的函数。不过,这些是写作的熊。
如果您希望坚持只使用 宏,那么您的选择就不那么友好了。 Ajay B 的解决方案(根据评论修复)效果很好。
GCC支持一些消除重新评估问题的nice extensions:
#define max(a,b) \
({ typeof (a) _a = (a); \
typeof (b) _b = (b); \
_a > _b ? _a : _b; })
然后,您可以轻松编写任何您希望不会出现括号或重新评估恐怖的n-ary宏。
#define max3(a,b,c) max(a,max(b,c))
答案 2 :(得分:0)
我认为你在问题中遗漏的关键点是&#34;宏&#34;不是和宏。如果按照以下方式进一步细分,可以对此进行简化 -
#define min2(a, b) ((a) < (b) ? (a) : (b))
#define min(a, b, c) (min2(min2((a), (b)), (c)))
这也更容易理解。