You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何注释typedef重定义语句后仍可使用对应的结构体类型?

为什么注释掉自定义typedef后还能用POINT和PPOINT?

哈哈,这个问题我刚学C++的时候也踩过同款坑!其实答案很直白:你是在Windows环境下编译这段代码的,系统已经提前帮你预定义了POINT和PPOINT这两个类型。

具体拆解一下:

  • Windows SDK(写Windows程序依赖的系统头文件集合)里早就有一个POINT结构体,结构和你写的_tagPlayerPos完全一致——都是包含两个int类型的x和y成员。而PPOINT就是POINT*的typedef别名,系统也一并定义好了。
  • 你可能疑惑自己没显式包含<windows.h>啊?其实在Visual Studio这类Windows平台的编译器中,默认项目配置会隐式引入一些系统头文件,或者通过<iostream>这类标准头文件间接带进来了(虽然iostream本身不包含,但编译器的默认依赖会补全这部分)。
  • 想验证的话很简单:在代码最开头加上两行#undef POINT和#undef PPOINT,再编译试试——这时候编译器肯定会报错说找不到POINT和PPOINT,直接实锤是系统预定义的了。

不过这里要提个隐患:这种“巧合适配”虽然现在能用,但风险不小:

  • 如果你以后修改自己的_tagPlayerPos结构体(比如加个z坐标),那系统的POINT和你的自定义结构就不匹配了,代码会出各种奇怪的内存问题。
  • 要是把代码拿到Linux或者macOS这类非Windows平台编译,注释掉自己的typedef后直接就编译失败——因为那边根本没有这些预定义类型。

所以建议还是把你自己的typedef恢复,或者给自定义类型起个独特的名字(比如PlayerPos、MyPoint),彻底避免和系统类型重名冲突~

内容的提问来源于stack exchange,提问作者Meggii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 00:17:50