30

C++ で使用したい場合、 orsize_tを含める必要があります<stddef.h><cstddef>? 何人かの人々がそれ<cstddef>は悪い考えだと言っているのを聞いたことがあります。何故ですか?

4

5 に答える 5

44

stddef.hCヘッダーです。名前size_tはその中のグローバル名前空間にあります。<cstddef>一方、 は、C 名を std 名前空間にラップする C++ ヘッダーです。これは当然のことながら C++ のアプローチ<cstddef>ですstd::size_t。明らかに、C++ では、C++ アプローチの方が適切です。

技術的には、C ヘッダーにもstd 名前空間の名前が含まれる場合があります。しかし、C ヘッダー (.h で終わるもの) は、名前をグローバル名前空間にも導入します (したがって、それを汚染します)。

于 2011-02-22T14:30:47.730 に答える
16

私は好き#include <stddef.h>です。

Cヘッダーの名前の一部はマクロにすることができますが、セットはCルールとは異なります。CではEXIT_FAILURE、、、isdigit()aogetc()はマクロです。C ++のマクロはどれか知っていますか?

次に、ヘッダーを持つために必要な標準Cヘッダーは2つだけですが<cfoo>、Posixヘッダーは必要ありません。どのヘッダーが標準で、どのヘッダーがコンパイラーによってのみ提供されるか知っていますか?

第三に、サードパーティのCライブラリのヘッダーを使用すると、最終的にはになります。#include <stddef.h>私はとを混在させたくないのです。<stddef.h><cstddef>

第4に、新しいC ++標準の現在のドラフトでは<cstdlib>、シンボルをグローバル名前空間にダンプできるとされています(最近では多くのコンパイラがすでにそうしているため)。したがって、使用し#include <cstdlib>ても、グローバル名前空間が将来汚染されないという保証はありません。したがって、ポータブルコードを作成するときは、グローバル名前空間が影響を受けると想定する必要があります(現在は許可されていませんが)。これを知っている専門家はごくわずかであるため(ここのコメントの説明を参照)、<stddef.h>初心者のC ++プログラマーでも、グローバル名前空間を汚染することを理解しているので、使用することをお勧めします。

于 2011-02-22T14:44:25.780 に答える
11

<stddef.h>公式には C++ の非推奨の部分です (C++ 標準の Annex D の残りの部分と共に)。これらはすべて標準 C の (非推奨ではない) 一部であるため、C++ では非推奨になっていますが、ほぼ無期限に使用できることは事実上確実です。

廃止されていない多くの機能は、ほぼ確実に最初に消滅します --export現在の C++0x のドラフトからは既に削除されています。附属書 D. これらのヘッダーが本当に時代遅れになった場合、それはおそらく David Vandervoorde のモジュール提案の成熟したバージョンからのものであり、すべてのヘッダーを簡単に時代遅れにする可能性があります。

同時に、かなりの数のコンパイラ (特に古いもの) は<c*>、標準で規定されているとおりにヘッダーを実装していません。<*.h>それらで動作するコードを書きたい/必要がある場合は、ヘッダーの代わりにヘッダーを使用することでかなりの利益が得られます<c*>

<c*>最終的に、ヘッダーは問題を探すためのソリューションだったと思います。C 標準では、これらのヘッダーは必要な名前のみを定義する必要があります。先頭のアンダースコアの後に別のアンダースコアまたは大文字が続くなど、予約されている名前以外はまったく定義しないでください。予約済みの名前 (およびその他のいくつか) は C++ でも予約済みであるため、いずれの場合も、移植可能なコード内の何かと衝突することはありません。<c*>そのため、C 標準ライブラリの既存の名前と衝突するグローバル名前空間で名前を定義する機能は、すべてのヘッダーで購入できます。これは非常にひどいアイデアであり、検討する価値さえないため、実際的な観点からは何も得られません。

編集:その役に立たない機能でさえ、アップコーミングC++ 0xの現在のドラフトが<c*>ヘッダーにグローバル名前空間を汚染する許可を与えるのに十分な数の実際のコンパイラで機能したため、理論的な利点でさえなくなりました。

于 2011-02-22T16:06:02.643 に答える
2

どちらも標準であり、知る限り、そこにとどまります。

形式 cXXX は常に std 名前空間の名前を導入し、形式 XXX.h は常にグローバル名前空間の名前を導入します。どちらも他の名前空間に名前を入れることもできます (少なくとも C++0X では、以前はそうではありませんでした。その制約に関して、制御していない C ライブラリから C++ ライブラリを構築することは不可能になるため、 g++ は、少なくとも非 glibc ターゲットではその問題に悩まされています)。

従来の Unix ヘッダーの場合、テストしたすべての実装で、必要な機能マクロが以前に定義されている場合、フォーム XXX.h に追加の Unix 識別子が含まれています。フォーム cXXX の動作は、実装間で一貫性がありませんでした。したがって、実際には、これらの宣言が必要になることが多いため、XXX.h を使用します。

于 2011-02-22T14:50:55.023 に答える
-3

<cstddef>は標準であり、そうで<stddef.h>はありません。それはほとんどそれで終わりです。それに依存するプログラムがたくさんあるため、すぐに非推奨になることはありません。

于 2011-02-22T14:24:34.157 に答える