我正在使用两台计算机,每台计算机都有不同版本的visual studio。在visual studio 2008计算机上,我的代码编译。在visual 2010计算机上,我的代码无法编译,因为我正在使用宏max(a,b)
,据我所知,它是在stdlib.h中定义的。我不能只定义max(a,b)
因为它将在visual 2008计算机上重新定义。但是,如果我没有定义max(a,b)
,我的代码就无法在visual 2010计算机上编译。
任何解决方案?
答案 0 :(得分:29)
任何在其标准头文件中定义名为max
的宏的C库都超乎想象。幸运的是,如果您需要支持此类平台,则可以在包含系统标头之后以及任何自己的标头/代码之前,#undef max
(以及它定义的任何其他有问题的宏)进行简单的解决方法。
请注意,其他人都说要将您的定义包装在#ifndef max ... #endif
中。这不是一个好主意。在系统头中定义max
表示实现者不称职,并且某些版本的环境可能有不正确的宏(例如,那些不能正确保护参数的宏)括号,但我甚至看到一个max
宏在我的生命中至少错过了min
而不是max
!)。只需使用#undef
并保持安全。
至于stdlib.h
定义max
的原因如何,C标准非常具体地说明了为应用程序保留了哪些名称以及为标准函数和/或内部使用保留了哪些名称通过实施。这有很好的理由。在系统头中定义可能与应用程序中使用的变量/函数名冲突的宏名称是危险的。在最好的情况下,它导致编译时错误的原因很明显,但在其他情况下,它可能会导致非常奇怪的行为,很难调试。在任何情况下,它都会使编写可移植代码变得非常困难,因为您永远不知道库已经采用了哪些名称。
答案 1 :(得分:4)
回答你的主要问题:
是否在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 */
答案 2 :(得分:3)
使用#ifndef
保护它。
#ifndef max
#define max(a,b) ((a) > (b) ? (a) : (b))
#endif
请注意,上述版本不如内联函数安全,例如: max(a++,b--)
会导致无法预料的结果。
答案 3 :(得分:0)
你可以使用条件编译:
#ifndef max
#define max(a,b) ...
#endif
答案 4 :(得分:0)
在Visual C ++中,如果在包含标准标题之前#define NOMINMAX
,则不会获得宏max
或min
。