为何无法引入<cwindows>?C++头文件现代命名规则疑问
这个问题问得挺接地气的,核心原因其实是这些头文件的“出身”和设计目的完全不同,咱们拆开来聊:
带
c前缀的头文件是C++标准对C标准库的标准化封装
C在诞生之初就兼容C语言,后来为了规范命名空间的使用,标准委员会把所有C标准库的.h头文件(比如stdint.h、stdio.h)都重新封装成了cxxx的形式(比如<cstdint>、<cstdio>)。这类头文件的作用是把原来C标准库的标识符(像uint32_t、printf)放到std命名空间里,同时保留对旧代码的兼容性。而且这些c前缀头文件是**C标准强制要求所有编译器必须支持的**,属于标准库的一部分。<windows.h>是Windows平台专属的SDK头文件,和标准库无关
<windows.h>是微软为Windows操作系统专门提供的系统API头文件,用来调用窗口创建、进程管理、系统资源访问这类Windows特有的功能。它不属于C或C的标准规范范畴,C标准从来没有规定过要给这类平台专属的头文件提供c前缀的版本,所以自然不存在<cwindows>这种东西。平台头文件的规则由厂商说了算
微软作为Windows平台的主导者,自己定义了Windows SDK头文件的命名规则——就是用.h后缀的形式,并没有提供c前缀的变体。而且Windows头文件本身就已经做到了C/C++兼容,里面的标识符要么在全局命名空间,要么在微软自己定义的命名空间(比如winrt)里,完全不需要套用标准库的c前缀封装逻辑。
举个直观的例子:当你包含<cstdint>时,uint32_t会出现在std命名空间中(部分编译器也会保留全局命名空间的版本);但包含<windows.h>后,HWND、CreateWindowW这些标识符都是直接暴露在全局或者微软专属命名空间里的,和标准库的封装机制没有半毛钱关系。
内容的提问来源于stack exchange,提问作者01o

