每个项目的预处理器定义是否会覆盖继承的值?

时间:2016-01-14 15:01:33

标签: visual-studio winapi visual-c++

我想设置_WIN32_WINNT = 0x0601(Windows 7),但我发现它仍然卡在0x0502上 - 某些WinAPI函数不可用,并且intillisense在重建后将值显示为0x502。

我的预处理器定义窗口如下所示:

{{0}}

我们有一个用于所有项目的标准属性文件,我不想仅为一个模块修改...这会导致问题吗?

如果我手动重新定义我的StdAfx.h文件中的值,它似乎可以工作,但我有点担心这样做:

#ifdef _WIN32_WINNT
    #undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x601

2 个答案:

答案 0 :(得分:1)

如果您想控制首先获取哪组预处理器定义,可以查看属性表(.props / .vsprops)。您可以使用此命令指定评估顺序,因此可以在默认道具之前使用覆盖.props文件。

例如,我的产品也可以在Windows XP上运行,因此_WIN32_WINNT需要为0x0500。我为我的Vista ++项目添加了一个道具,指定_WIN32_WINNT为0x0600。我将其标记为在默认道具文件之前进行评估。除非WINVER为> = 0x0501,否则此方法也可用于不在VS 2013中编译的MFC项目。

这不是一个完美的解决方案,但除了使用undef和define之外,这可能是最佳选择。

答案 1 :(得分:0)

  

每个项目的预处理器定义是否会覆盖继承的值?

不,他们没有。

Visual Studio通过将它们命名为继承来产生误导,就好像它们可以被覆盖一样。发生的事情是,您所有以WIN32开头的定义都被简单地制成一个列表,该列表以这种方式传递给编译器: /DWIN32 /D_WIN32_WINNT=0x0601 ... /D_WIN32_WINNT=0x0502 /D_MDCS /D_AFXDLL。如您所见,无论如何,您尝试为_WIN32_WINNT设置的内容都会得到“继承”。 这真是愚蠢,它们应该颠倒顺序或进行定义,这样,继承的值将不会覆盖您在项目中设置的值。

避免此错误的一种可行解决方案是取消选中错误的“继承”,并在覆盖之前手动放置继承的值:

_WINDOWS
%(PreprocessorDefinitions)
_WIN32_WINNT=0x0601

这是我项目中的样子:

enter image description here