c++ - 为什么包含 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 {};
}
我们得到以下编译错误:
syntax error: missing ';' before identifier 'rect' (C2146) [25, 5]
'rect': undeclared identifier (C2065) [25, 5]
expected a ';' [25, 15]
'rect': undeclared identifier (C2065) [26, 5]
identifier "rect" is undefined [26, 32]
function call missing argument list (C4551) [25, 5]
哎呀!
微软的文档并没有提供太多见解: https ://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2146?view=vs-2019
(我还是 C++ 的新手,如果这很明显,我深表歉意)
我假设在 windows.h 中的某处有某种...指令会改变某种行为,但我不确定要搜索或寻找什么。
谢谢!
解决方案
Derp好的,找到答案了。
我Rectangle
用作“你好世界”的例子。
原来 windows.h 已经包含一个“矩形”,这意味着符号碰撞
(https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-rectangle)
隐含的“windows.h 中的所有内容现在都可以在全局命名空间中使用!” 让我措手不及。
(将我的班级名称切换为“Marks_Rectangle”可以解决问题!)
推荐阅读
- flutter - Flutter Webview 自动填充登录
- reactjs - React-admin 不会正确添加 id 来显示视图 url
- javascript - 变量使用前的验证
- python - 为什么 eval() 找不到函数?
- google-apps-script - 如果查询的列中有空格,则突出显示标签总和(Col#)单元格?
- javascript - 将字符串拆分为实体框架中的列表
- oracle - 创建与现有 Oracle 表结构相同的 Oracle 类型
- c# - 使用 MouseEnter() 事件引用父级?(或任何其他事件)
- spring-cloud - Spring boot admin 显示网关服务器关闭的状态
- flutter - 在 Flutter 中跨页面保留状态