GCC 是否可以修改 C++ 功能的 C 标头
Can GCC modify C headers for C++ features?
该标准在第 17.6.1.2 节第 4 段中说:
除非在条款 [language.support] 到 [thread] 和 附件 [depr],每个标题 cname 的内容应与 相应的标头名称.h,如 C 中指定 标准库([intro.refs])或C Unicode TR,视情况而定, 仿佛通过包容。
然后在第18.2节但第2段中:
内容与标准C库标头
<stddef.h>
相同, 具有以下更改:
我读到这意味着<cstddef>
必须包含未经修改<stddef.h>
。但是GCC在他们的头文件中有这个:
/usr/lib/gcc/$TRIPLET/5.3.1/include/stddef.h
#if defined (_STDDEF_H) || defined (__need_NULL)
#undef NULL /* in case <stdio.h> has defined it. */
#ifdef __GNUG__
#define NULL __null
#else /* G++ */
#ifndef __cplusplus
#define NULL ((void *)0)
#else /* C++ */
#define NULL 0
#endif /* C++ */
#endif /* G++ */
#endif /* NULL not defined and <stddef.h> or need NULL. */
#undef __need_NULL
按照标准,这合法吗?
你引用的关键部分是:
。每个标头 CNAME 的内容应与相应的标头名称.h 的内容相同,如 C 标准库 ([intro.refs]) 或 C Unicode TR 中指定
。
它在几个方面是模棱两可的:
-
什么构成"内容"? 是所有文本文件内容,还是其中的声明和定义集,还是仅对特定语言可能可见的声明和定义(假设 C 程序不定义
__cplusplus
)? -
"如规定"是对cname内容的要求,还是对name.h内容的要求? 如果要求与cname(我的解释)有关,那么与name.h内容相关的限制就没有限制。
由于如此模棱两可,我认为你的问题没有明确的答案,但我也看不出有什么理由关心......
除非在条款[language.support]通过[线程]和附件[depr][...]中注明,就像通过包含一样。
- 我不明白"好像通过包容"如何被理解为"通过实际包容"。
- §18.2 是 [language.support] 的一部分,因此它包含在"[language.support] 到 [thread]"范围内,因此无论如何它都属于"除非另有说明"子句。
相关文章:
- g++ 说函数不存在,即使包含正确的标头
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 在CMake中使用find_package时,是否会显式包含标头
- 错误"Could not find Boost"(缺少:上下文标头)
- 如何在标头中声明(或定义)函数的问题
- 如何避免在仅标头库中C++类/变量重定义
- C++算法标头中,为什么要使用 "!(val < *first)" ?
- C++标头错误 C2238 意外标记";"
- std::initializer_list,大括号初始化和标头
- 在 c++ 中拆分类和标头中的继承,错误
- 如何确定哪个标头调用 c++ 中的另一个标头
- 如何在生成文件中添加多个标头 (HDR) 和对象?
- 我可以在运行时重新定义在 OpenCascade/OCCT 标头中定义的 c++ 静态常量吗?
- GCC,CMake,预编译标头和维护依赖项
- VisualStudio:使用 Suse Enterprise Server 12 SP5 时,不会下载远程库标头
- 为什么C 模板功能无法在同一标头文件中识别功能
- C Linux代码破坏Windows构建,因为缺少标头意味着功能不确定
- 在没有库的一个标头文件中创建类和功能
- GCC 是否可以修改 C++ 功能的 C 标头
- Objective-C中的C 样式功能标头