最近,当将一些STL代码移植到VS2008时,我希望通过定义新的std::copy
标志来禁用_SCL_SECURE_NO_WARNINGS
生成的警告。您可以通过两种方式执行此操作:
在包含相关STL标题之前定义宏样式,或者在stdafx.h中定义总覆盖率:
#define _SCL_SECURE_NO_WARNINGS
这两种方法都运行良好,但我想知道是否有任何争论支持一方而不是另一方?
答案 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 ...