首页 > 解决方案 > 为什么包含 windows.h 会产生语法错误,从而阻止类的实例化?(C2146, C2065)

问题描述

(平台详情:Windows 10、Visual Studio C++ (MSVC 14.26.28801))

这是一个基本的复制品。考虑以下运行良好的程序:

struct Rectangle {};

int main() {
    Rectangle rect {};
}

按预期编译和运行。

但是现在如果我们像这样引入 windows.h 的导入:

#include <Windows.h>

struct Rectangle {};

int main() {
    Rectangle rect {};
}

我们得到以下编译错误:

哎呀!

微软的文档并没有提供太多见解: https ://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2146?view=vs-2019

(我还是 C++ 的新手,如果这很明显,我深表歉意)

我假设在 windows.h 中的某处有某种...指令会改变某种行为,但我不确定要搜索或寻找什么。

谢谢!

标签: c++windowswinapivisual-c++

解决方案


Derp好的,找到答案了。

Rectangle用作“你好世界”的例子。

原来 windows.h 已经包含一个“矩形”,这意味着符号碰撞

https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-rectangle

隐含的“windows.h 中的所有内容现在都可以在全局命名空间中使用!” 让我措手不及。

(将我的班级名称切换为“Marks_Rectangle”可以解决问题!)


推荐阅读