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

sna*_*ile 20 c macros std max visual-studio

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

有解决方案吗

R..*_*R.. 31

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

请注意,其他人都在说你的定义#ifndef max ... #endif.这不是一个好主意.max在系统头中定义表明实现者是无能的,并且环境的某些版本可能有不正确的宏(例如,那些没有用括号正确保护参数的max宏,但我甚至看到过一个宏在我的生活中不正确地执行min而不是max至少一次!).只是使用#undef并且安全.

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

  • @R ..谢谢,但是请你解释为什么定义max的C库超出了想象? (4认同)
  • 你对`<stdlib.h>`不应该定义`max`的原因的评论在某一点上是有效的.如果用户明确请求实现提供的额外定义(例如,通过定义`__EXTENSIONS__`(非官方)或`_POSIX_C_SOURCE`(官方)),那么`<stdlib.h>`允许提供额外的定义.并且在许多平台上,默认情况下可以启用扩展,并且仅通过请求"标准符合模式"使其不可用. (2认同)
  • @Jonathan:同样正确的是,定义意外的宏对程序员来说比定义意外函数更难.编译器错误(如果有的话)不太可能有很大意义. (2认同)

Joh*_*ter 5

用 保护它#ifndef

#ifndef max
    #define max(a,b) ((a) > (b) ? (a) : (b))
#endif
Run Code Online (Sandbox Code Playgroud)

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

  • 令人惊讶的是,过去 5 年没有人注意到。固定的! (3认同)

Cal*_*ius 5

因此,回答您的主要问题:

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

不,不是这样,它是在windef.h中围绕第187行定义的:

#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 */
Run Code Online (Sandbox Code Playgroud)