是否在stdlib.h中定义了max(a,b)?

我正在使用两台计算机,每台计算机都有不同版本的visual studio。 在visual studio 2008计算机上,我的代码编译。 在visual 2010计算机上,我的代码无法编译,因为我使用的是宏max(a,b) ,据我所知,它是在stdlib.h中定义的。 我不能只定义max(a,b)因为它将是visual 2008计算机上的重新定义。 但如果我没有定义max(a,b)我的代码就无法在visual 2010计算机上编译。

有解决方案吗

任何在其标准头文件中定义名为max的宏的C库都超乎想象。 幸运的是,如果需要支持这样的平台,一个简单的解决方法是在包含系统头之后和任何自己的头/代码之前#undef max (以及它定义的任何其他有问题的宏)。

请注意,其他人都说要将您的定义包装在#ifndef max ... #endif 。 这不是一个好主意。 在系统头中定义max表示实现者不称职,并且环境的某些版本可能有不正确的宏(例如,那些没有用括号正确保护参数的宏,但我甚至看到了一个max宏在我的生命中,至少有一次错误地执行min而不是max !)。 只需使用#undef

至于为什么stdlib.h如此破坏以定义max ,C标准非常具体地说明了为应用程序保留了什么名称以及为实现标准函数和/或内部使用保留了哪些名称。 这有很好的理由。 在系统头中定义可能与应用程序中使用的变量/函数名冲突的宏名称是危险的。 在最好的情况下,它会导致编译时错误,原因很明显,但在其他情况下,它会导致非常奇怪的行为,很难调试。 在任何情况下,编写可移植代码都非常困难,因为您永远不知道库已经采用了哪些名称。

#ifndef保护它。

 #ifndef max #define max(a,b) ((a) > (b) ? (a) : (b)) #endif 

请记住,上面的版本不如内联函数安全,例如max(a++,b--)会导致不可预见的结果。

所以回答你的主要问题:

是否在stdlib.h中定义了max(a,b)?

不,不是,它在第​​187行的windef.h中定义:

 #ifndef NOMINMAX #ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif #endif /* NOMINMAX */ 

你可以使用条件编译:

 #ifndef max #define max(a,b) ... #endif 

在Visual C ++中,如果在包含标准标题之前#define NOMINMAX ,则不会获得宏maxmin