包括windows.h导致与本地变量名冲突

时间:2011-07-13 12:26:02

标签: c++ windows visual-studio

我在Visual Studio项目中将windows.h包含在我的一个h文件中(为了使用CaptureStackBackTrace)。起初我得到了一些编译器错误,因为使用了min / max std方法和windows.h中具有相同名称的宏,但这似乎是由#define NOMINMAX解决的,正如我在其他SO帖子中所读到的那样。 (我说"似乎"因为我无法确定,直到我的整个项目再次构建好)。

问题是一些局部变量名称现在破坏了构建。这一行:

int grp1;

在类方法中,会导致以下错误:

error C2143: syntax error : missing ';' before 'constant'

如果我将变量名称更改为grp1_,则cpp文件编译正常。

当然我可以改变变量名称,但是我感觉我做错了什么 - 是吗?或者在包含windows.h时这是一个已知问题?除了更改变量名之外,还有其他更优雅的解决方案吗?

3 个答案:

答案 0 :(得分:10)

dlg.h包含行

#define grp1        0x0430

您可以通过定义WIN32_LEAN_AND_MEAN来排除它。

答案 1 :(得分:3)

在某种程度上,所有库标题都存在问题。对于(标准库的)实现,C和C ++保留以_开头的名称。其他图书馆都是独立的。人们希望有namespace,或者如果库必须可以在C中编译,某种命名约定,例如前缀,但Windows和Posix都不会这样做。 (在早期,X的标题包含#define String,这导致其他库无问题。)

最后,没有任何好的解决方案。您只需要等到它被它击中,然后更改您的功能名称。 (windows.h特别糟糕,因为其中的大多数“函数”实际上都是宏,并且不遵守范围。)

答案 2 :(得分:1)

嗯,grp1在dlgs.h中定义如下:

#define grp1        0x0430

和dlgs.h包含在windows.h中,因此发生了冲突。

#undef grp1之后#include <windows.h>可以{{1}}。不是最漂亮的网站,但如果你只包含一次windows.h,你可以将这些修复保存在一个地方。