我在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
时这是一个已知问题?除了更改变量名之外,还有其他更优雅的解决方案吗?
答案 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,你可以将这些修复保存在一个地方。