【问题标题】:Defining macros in Visual Studio - /D or #define?在 Visual Studio 中定义宏 - /D 或 #define?
【发布时间】:2008-11-17 19:51:26
【问题描述】:

最近,在将一些 STL 代码移植到 VS2008 时,我想通过定义新的 _SCL_SECURE_NO_WARNINGS 标志来禁用 std::copy 生成的警告。您可以通过两种方式做到这一点:

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

    #define _SCL_SECURE_NO_WARNINGS

这两种方法都可以正常工作,但我想知道是否有任何论据支持一种优于另一种?

【问题讨论】:

    标签: c++ visual-studio


    【解决方案1】:

    /D 选项通常在您想在不同的构建上以不同方式定义它时使用(因此可以在 makefile 中更改它)

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

    【讨论】:

      【解决方案2】:

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

      如果它们在代码中,它们总是在代码中,无论它是否适合平台。对于 GCC 或未来版本的 Visual C++,您不需要它。另一方面,通过将它包含在代码中,它就更明显地存在了。如果您移动(复制)代码,则更容易记住与它一起移动该定义。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          如果您确实将它们放入您的代码中,请记住正确地对它们进行 ifdef:

          #ifdef _MSC_VER
          #define _SCL_SECURE_NO_WARNINGS
          #endif
          

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

          【讨论】:

          • 定义一个符号通常不会在移动到不同的平台时造成伤害,即使它没有做任何事情。一个简单的评论同样有效。
          • 在这种情况下,绝对不会,但在一般情况下,我认为在适当的 ifdef/endif 对中包含特定于编译器的定义是谨慎的。
          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-01-10
              • 2012-09-11
              • 1970-01-01
              • 1970-01-01
              • 2010-11-11
              • 2012-07-24
              • 1970-01-01
              相关资源
              最近更新 更多