web-dev-qa-db-ja.com

C標準とC ++標準の関係は何ですか?

私は書いていました この答え そして私は http://en.cppreference.com/w/cpp/string/byte/tolower#Parameters から引用しました

Unsigned charとして表現できず、EOFと等しくない、動作は定義されていません

私が調べに行ったとき このフレーズを追加した編集 著者のコメントが見つかりました:

C99 7.4/1に準拠したctype.h関数で負の符号付き文字を使用することはできません

著者は、C++ドキュメントのC99標準から引用しています。それは有効ですか? C++標準ではこの関数の定義について何も見つからなかったので、それが有効であると想定する必要があります。

しかし、これは2つの理由で私に関係しています。

  1. C++標準が依存しているC標準のバージョンをどのように知ることができますか?
  2. どこでもCとC++の間の不一致 のリストがあります。 C++を参照してC標準を見ている場合、見ている領域がオーバーライドされているかどうかをどうやって知ることができますか?
40
Jonathan Mee

最初の質問の場合:

C++標準は、依存するC標準を規範的参照セクションに明示的にリストします。 C++ 14の場合、[intro.refs] 1.2/1はC99をリストします。

  • 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、技術正誤表

2番目の質問の場合:

C++標準には、C標準のany部分が暗黙的に組み込まれていません。 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では、N4140の1.2 [intro.refs]に記載されているように、ISO/IEC 9899:1999(および3つのコリジェンダム、つまり本質的にC99)です。 C++ 98ではC90、C++ 17ではおそらくC11になりますが、C++標準では常にそれが明示されます。

C++を参照してC標準を見ている場合、見ている領域がオーバーライドされているかどうかをどうやって知ることができますか?

C++標準を見ると、C定義からrestrictを引いたもの、または必要なC動作を明示的にインポートするか、明示的に変更を加えています。

通常、標準自体の代わりに優れたドキュメントを読むと、問題なく機能します。


最初の質問に対処するには:

著者は、C++ドキュメントのC99標準から引用しています。それは有効ですか?

はい、なぜなら

1 表74 [std::tolower、meを含む]、75、76、77、78、および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には適用されません。

N4140の21.8 [c.strings]

14
Baum mit Augen

編集は正しく、この特定のテキストはC90以降標準になっています。

C904.3から

ヘッダーは、文字のテストとマッピングに役立ついくつかの関数を宣言します。すべての場合において、引数はintであり、その値はunsigned charとして表現可能であるか、マクロの値と等しくなければなりませんEOF。引数に他の値がある場合、動作は次のようになります。未定義。

C11 7.4/1から

ヘッダーは、文字の分類とマッピングに役立ついくつかの関数を宣言します。すべての場合において、引数はintであり、その値はunsigned charとして表現可能であるか、マクロEOFの値と等しくなければなりません。引数に他の値がある場合、動作は未定義です。

同一のテキスト; Cはいつもこんな感じでした。したがって、すべてのCバージョンは同等であるため、特定のC++バージョンがどのCバージョンを使用するかは問題ではありません。

3
Lundin