在Visual Studio中定义宏 - / D或#define?

时间:2008-11-17 19:51:26

标签: c++ visual-studio

最近,当将一些STL代码移植到VS2008时,我希望通过定义新的std::copy标志来禁用_SCL_SECURE_NO_WARNINGS生成的警告。您可以通过两种方式执行此操作:

  • 使用 / D 编译器开关,可在项目属性中指定。您需要确保为Release和Debug构建定义它,我经常忘记这样做。
  • 在包含相关STL标题之前定义宏样式,或者在stdafx.h中定义总覆盖率:

    #define _SCL_SECURE_NO_WARNINGS

这两种方法都运行良好,但我想知道是否有任何争论支持一方而不是另一方?

6 个答案:

答案 0 :(得分:10)

当你想在不同的版本上以不同的方式定义它时,通常会使用/ D选项(因此可以在makefile中更改它)

如果你“总是”希望它以相同的方式设置,请使用#define。

答案 1 :(得分:5)

通过将它们放在项目文件中,您可以在平台特定警告和平台之间保持紧密关联,这对我来说是正确的。

如果他们在代码中,他们总是在代码中,无论它是否适合该平台。对于GCC或可能的Visual C ++未来版本,您不需要它。另一方面,通过在代码中使用它,更明显的是它就在那里。如果您移动(复制)代码,则更容易记住用它移动该定义。

各方面的优点和缺点。 YMMV。

答案 2 :(得分:2)

如果你有一个包含在所有其他标题中的标题(比如stdafx.h),你应该把它放在那里。编译器命令行开关通常用于构建选项,它们并不总是设置,如NDEBUG,UNICODE等。虽然您的宏必须始终设置。

这可能听起来很随意。事实上,有些人可能会说其他事情。但最后,你必须决定什么适合你的情况。

答案 3 :(得分:1)

如果您确实将它们放入代码中,请记住如果正确设置它们:

#ifdef _MSC_VER
#define _SCL_SECURE_NO_WARNINGS
#endif

这将使您的代码可移植。

答案 4 :(得分:1)

一般来说,我更喜欢在代码中使用#define,而不是在大多数情况下使用/ D编译器开关,因为查找#define似乎比检查编译器设置更直观。

答案 5 :(得分:1)

/ D不是msbuild.exe的有效标志(至少我使用的版本是v2.0.50727)。

这样做的方法是:

/p:DefineConstants="MY_MACRO1;MY_MACRO2"

这样做的结果是:

Target CoreCompile:
    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Csc.exe /define:MY_MACRO1;MY_MACRO2 ...