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

Visual studio 每个项目预处理器定义是否覆盖继承的值?,visual-studio,winapi,visual-c++,Visual Studio,Winapi,Visual C++,我想设置\u WIN32\u WINNT=0x0601(Windows 7),但我发现它似乎仍然卡在0x0502-一些WinAPI函数不可用,重建后IntillSense将值显示为0x502 “我的预处理器定义”窗口如下所示: 我们有一个用于所有项目的标准属性文件,我不想只为一个模块修改它。。。这会引起问题吗 如果我手动重新定义StdAfx.h文件中的值,它似乎可以工作,但我有点担心这样做: #ifdef _WIN32_WINNT #undef _WIN32_WINNT #endif

我想设置
\u WIN32\u WINNT=0x0601
(Windows 7),但我发现它似乎仍然卡在
0x0502
-一些WinAPI函数不可用,重建后IntillSense将值显示为0x502

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

我们有一个用于所有项目的标准属性文件,我不想只为一个模块修改它。。。这会引起问题吗

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

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

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

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

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

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

不,他们没有

VisualStudio将它们命名为继承的,似乎它们可以被覆盖,这是一种误导。发生的情况是,所有以
WIN32
开头的定义都被简单地制作成一个列表,通过以下方式传递给编译器:
/DWIN32/D\u WIN32\u WINNT=0x0601/D_WIN32_WINNT=0x0502/D_MDCS/D_afxdl
。正如您所看到的,无论您试图为
\u WIN32\u WINNT
get的“继承”设置什么。 这真是愚蠢,他们应该颠倒顺序或定义,这样继承的值就不会覆盖您在项目中设置的值

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

_WINDOWS
%(PreprocessorDefinitions)
_WIN32_WINNT=0x0601
这是我的项目中的外观:


在命令行上定义预处理器符号与使用相同。无法重新定义预处理器符号(除非两个定义在词汇上或在Visual Studio中在语法上完全相同)。我希望命令行上的预处理器符号定义遵循相同的规则。换句话说:您对预处理器定义的使用是未定义的。如果
\u WIN32\u WINNT
在所有编译单元中不相同,请不要将其添加到用于所有编译单元的公共属性表中。