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

including windows.h causes clashing with local variable name

本文关键字:变量名 冲突 windows 包含      更新时间:2023-10-16

我包括windows.h在我的h文件之一(为了使用CaptureStackBackTrace),在一个visual studio项目。起初我得到了一些编译器错误,因为在windows.h中使用了最小/最大std方法和同名宏,但这似乎是由#define NOMINMAX解决的,正如我在其他SO帖子中读到的。(我说"似乎"是因为我不能确定,直到我的整个项目再次建立)。

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

int grp1;

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

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

而cpp文件编译ok,如果我改变变量名称为grp1_

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

dlg.h包含

#define grp1        0x0430

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

在某种程度上,这是所有库头文件的问题。C和c++保留以_开头的名称来实现(标准库)。其他图书馆则是自行其是。人们希望有一个namespace,或者如果库必须在C中编译,某种命名约定,比如前缀,但Windows和Posix都没有这样做。(在早期,X的头文件包含一个#define String,这给其他库带来了很多问题。)

最后,没有任何好的解决方案。您只需要等待,直到您遇到它,然后更改函数的名称。(windows.h特别糟糕,因为大多数功能“其中实际上是宏,并且不服从作用域。

在dlgs.h:

中定义了grp1
#define grp1        0x0430

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

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