在 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 的黑暗角落:-)
这是我考试的题目:"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 的黑暗角落:-)