2008-11-17 271 views
4

近日,移植一些STL代码VS2008时,我想通过定义新_SCL_SECURE_NO_WARNINGS标志禁用由std::copy产生的警告。您可以通过两种方式来实现:在Visual Studio中定义宏 -/D或#define?

  • 使用/d编译器开关,可在项目属性来指定。您需要确保它为Release和Debug版本定义,我经常忘记它。
  • 通过定义它宏风格你有相关的STL头,或者,对于全覆盖之前,在stdafx.h中:

    #define _SCL_SECURE_NO_WARNINGS

这两种方法都工作得很好,但我想,如果有没有任何理由支持另一个呢?

回答

10

的/ d,当你想以不同的方式定义它在不同的构建(因此它可以在makefile更改)

如果将“总是”希望它设置相同的方式选项一般是用,使用#定义。

2

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

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

5

通过把它们放在你的项目文件中你保持特定于平台的警告和平台之间的密切联系,这似乎是正确的我。

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

优点和缺点。因人而异。

1

如果你把它们放在你的代码,记得IFDEF他们正确:

#ifdef _MSC_VER 
#define _SCL_SECURE_NO_WARNINGS 
#endif 

这将保持代码的可移植性。

+0

定义符号时移动到不同的平台通常不痛,即使它不什么都不做。简单的评论将同样有效。 – 2008-11-17 23:50:56

1

总的来说,我喜欢把#代码中定义的,而不是使用大部分的东西/ d编译器开关,因为它似乎是更直观地寻找一个比的#define检查编译器设置。

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 ...