簡體   English   中英

C和C ++標准之間的關系是什么?

[英]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 ++標准中找不到關於此函數定義的任何內容,因此我必須假設它是有效的。

但這有兩個原因讓我擔憂:

  1. 我怎么知道C ++標准所依賴的C標准的版本?
  2. 各地都有C和C ++之間存在差異的列表。 如果我在參考C ++看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章)。 特別感興趣的是:

  • 17.2 [library.c],描述了C標准庫的基本包含
  • 第18章[language.support],它描述了C ++標准庫的許多<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM