C语言中的MIN和MAX定义在哪里?

实现这些最好的方法是什么,尽可能的泛型和类型安全?(主流编译器的编译器扩展/内置优先。)


当前回答

我将避免同时将MIN和MAX定义为预处理器宏。 即使改进了实现,避免了双重评估,即。

#define max(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })

当您尝试在函数之外使用此函数(参见这里的示例)或在此答案中引用的变量阴影时,您会遇到其他问题,例如编译器错误。

如果你迫切需要宏所带来的性能优势,即代码内联,可以将它们实现为内联函数。大多数现代编译器都支持内联。比如像这样

inline int32_t MAX(int32_t a, int32_t b) { return((a) > (b) ? a : b); }
inline int32_t MIN(int32_t a, int32_t b) { return((a) < (b) ? a : b); }

(更多)

你必须为你需要的每一种数据类型实现一个变体,但通常你会使用有限的一组数据类型。话虽如此,请记住比较浮点数有它自己的怪癖,你需要比上面更复杂的代码(参见这里的讨论)。

其他回答

如果你需要min/max来避免昂贵的分支,你不应该使用三元运算符,因为它会编译成一个跳转。下面的链接描述了实现最小/最大函数而不进行分支的有用方法。

http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax

最简单的方法是将它定义为.h文件中的一个全局函数,如果您的程序是包含大量文件的模块化程序,则可以随时调用它。如果不是,double MIN(a,b){return (a<b?a:b)}是最简单的方法。

我知道那家伙说"C"… 但如果有机会,请使用c++模板:

template<class T> T min(T a, T b) { return a < b ? a : b; }

类型安全,其他注释中提到的++没有问题。

值得指出的是,如果你用三元运算来定义最小值和最大值,比如

#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

然后,为了在fmin(-0.0,0.0)和fmax(-0.0,0.0)的特殊情况下获得相同的结果,您需要交换参数

fmax(a,b) = MAX(a,b)
fmin(a,b) = MIN(b,a)

C语言中的MIN和MAX定义在哪里?

他们不是。

实现这些的最好方法是什么,尽可能的泛型和类型安全(主流编译器的编译器扩展/内置首选)。

作为功能。我不会使用像#define MIN(X, Y) (((X) < (Y))这样的宏?(X):(Y)),特别是如果您计划部署您的代码。要么写你自己的,使用标准的fmax或fmin,或者在GCC语句表达式中使用GCC的typeof(你也会得到类型安全奖励)修复宏:

 #define max(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })

每个人都说“哦,我知道双重求值,这没问题”,几个月后,你会连续几个小时调试最愚蠢的问题。

注意使用__typeof__而不是typeof:

如果你正在写一个头文件 必须工作时,包括在ISO C 程序,写__typeof__而不是 typeof。