为何注释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
相关产品推荐
相关产品推荐

