2016-06-09 87 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內容相關的限制。

有了這樣的模糊,我不認爲有一個明確的回答你的問題,但我也不能明白了一個道理關心....

相關問題