在 c 中使用 #define 宏预处理器查找 min(a,b,c) 或 max(a,b,c)

find min(a,b,c) or max(a,b,c) with using #define macro preprocessor in c

这是我考试的题目:"write cource code of min(a,b,c) with macros in c language."

#define min(a,b,c) ((a)<(b)?((a)<(c)?(a):(c)):((b)<(c)?(b):(c)))

有没有更好的方法来解决 min/max(x,y,z) 问题?

我认为您在问题中错过的关键点是 "macros" not and macro。如果将其进一步分解如下 -

#define min2(a, b) ((a) < (b) ? (a) : (b))
#define min(a, b, c) (min2(min2((a), (b)), (c)))

这也更容易理解。

是的。编写函数。

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 元宏,而不会遭受括号或重新计算的困扰。

#define max3(a,b,c) max(a,max(b,c))

您的解决方案,以及所有基于宏的便携式解决方案,都是应尽可能限制宏使用的充分理由。现在,我几乎只将它们用于条件编译。

在定义常量方面,你最好使用枚举。

就类似函数的宏而言,最好使用可以建议编译器内联的函数,或者只依靠编译器来解决(它们通常非常好在那)。


类函数宏不是一个好主意的原因是,作为简单的文本替换,序列:

#define mymax(a, b) (a) > (b) ? (a) : (b)
int x = mymax(y++, complexFunction());

将实际计算 y++ and/or 调用 complexFunction() 不止一次, 实际函数不会做的事情。

只要您了解这些限制,请务必使用它们。我,我会依靠编译器为函数做正确的事情,这样我就不必太担心 C 的黑暗角落:-)