[英]What is the Relationship Between the C and C++ Standards?
我正在寫這個答案 ,我引自http://en.cppreference.com/w/cpp/string/byte/tolower#Parameters
不能表示為unsigned char且不等於EOF,行為未定義
當我去檢查添加了這個短語的編輯時,我發現了作者的評論:
根據C99 7.4 / 1,不能對任何ctype.h函數使用負符號字符
作者引用C ++文檔中的C99標准。 這有效嗎? 我在C ++標准中找不到關於此函數定義的任何內容,因此我必須假設它是有效的。
但這有兩個原因讓我擔憂:
對於第一個問題:
C ++標准明確列出了它在其規范參考部分中所依賴的C標准。 對於C ++ 14,[intro.refs] 1.2 / 1碰巧列出C 99:
- ISO / IEC 9899:1999, 編程語言 - C.
- ISO / IEC 9899:1999 / Cor.1:2001(E), 編程語言 - C,技術勘誤1
- ISO / IEC 9899:1999 / Cor.2:2004(E), 編程語言 - C,技術勘誤2
- ISO / IEC 9899:1999 / Cor.3:2007(E), 編程語言 - C,技術勘誤3
對於第二個問題:
C ++標准沒有隱含地包含C標准的任何部分; 所有對C標准的引用都是明確的。 關於C ++偏離C的地方的一個很好的信息來源是附件C,C ++標准的“兼容性”,特別是C.1 [diff.iso]。
另外,對C標准庫的引用分散在C ++標准庫的描述中(C ++ 14中的第17-30章)。 特別感興趣的是:
<c:::>
標題(提供C標准庫功能的標題庫)。 我怎么知道C ++標准所依賴的C標准的版本?
在C ++ 14中,它是ISO / IEC 9899:1999(加上三個corrigendums,實質上是C99),如N4140中的1.2 [intro.refs]所述。 在C ++ 98中,它是C90,在C ++ 17中,它可能是C11,但C ++標准將始終明確。
如果我在參考C ++看C標准,我怎么可能知道我正在看的區域是否被覆蓋了?
您查看C ++標准,它顯式地導入C定義減去restrict
或它想要的任何C行為或進行顯式修改。
通常,閱讀好的文檔而不是標准本身將為您提供良好的服務。
解決您的初步問題:
作者引用C ++文檔中的C99標准。 這有效嗎?
是的,因為
1表74 [包含
std::tolower
,me],<cwctype>
和79描述頭<cctype>
,<cwctype>
,<cstring>
,<cwchar>
,<cstdlib>
(字符轉換),以及分別是<cuchar>
。
2這些頭文件的內容應與標准C庫頭文件<ctype.h>
,<wctype.h>
,<string.h>
,<wchar.h>
和<stdlib.h>
以及C Unicode相同TR頭<uchar.h>
分別具有以下修改[這些都不適用於std::tolower
,me]:
N4140中的21.8 [c.strings]
編輯是正確的,這個特定的文字自C90以來一直在標准中。
來自C90 4.3
標頭聲明了幾個對測試和映射字符有用的函數。 在所有情況下,參數都是一個int,其值應表示為unsigned char或者等於宏EOF的值。 如果參數具有任何其他值,則行為未定義。
從C11 7.4 / 1
標頭聲明了幾個用於分類和映射字符的函數。 在所有情況下,參數都是一個int,其值應表示為unsigned char或者等於宏EOF的值。 如果參數具有任何其他值,則行為未定義。
相同的文字; C一直都是這樣的。 因此,您的特定C ++版本使用哪個C版本並不重要,因為所有C版本都是等效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.