2016-06-09 67 views
0

标准说,在部分17.6.1.2第4段:GCC可以修改用于C++特性的C头文件吗?

除非如条款[language.support]注意到通过[线程]和 附件[DEPR],各标题的内容CNAME应如相应标题名称h的 那样,如在标准库([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 

这是法律的标准?

+3

这类问题的关键问题是始终“你能写出一个可以区分差异的合格程序吗?” –

+0

C和C++标准库标头不必是操作系统中filesysyem中的实际文件,您可以在编辑器中打开它并查找。它们是抽象的实体,只能通过它们各自的“#include”指令对合格程序的影响来定义。 –

回答

0

除了通过[主题]和附件如项 [language.support]注意[DEPR] [...] 仿佛的包容性。

  1. 我看不出“仿佛被列入”可以理解为“按实际包容性。”
  2. §18.2是[language.support]的一部分,所以它包含在“[language.support]到[thread]”的范围内,因此无论如何都属于“除指定之外”子句。
1

的你引用的关键部分是:

...每头CNAME的内容应当相同相应的头name.h的,如C标准库规定([intro.refs])或C- Unicode的TR ...

这是暧昧在几个方面:

  • 何谓“内容”?这是全部文本文件内容,还是其中的一组声明和定义,还是只有那些对特定语言可能可见的文件(假定C程序未定义__cplusplus)?

  • 对于cname的内容或name.h的内容,“按规定”是否有要求?如果需求涉及到cname(我的解释),那么没有与name.h内容相关的限制。

有了这样的模糊,我不认为有一个明确的回答你的问题,但我也不能明白了一个道理关心....