GCC 是否可以修改 C++ 功能的 C 标头

Can GCC modify C headers for C++ features?

本文关键字:功能 标头 C++ 修改 是否 GCC      更新时间:2023-10-16

该标准在第 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][...]中注明,就像通过包含一样。

  1. 我不明白"好像通过包容"如何被理解为"通过实际包容"。
  2. §18.2 是 [language.support] 的一部分,因此它包含在"[language.support] 到 [thread]"范围内,因此无论如何它都属于"除非另有说明"子句。