web-dev-qa-db-ja.com

cmath vs math.h(および同様のc-prefixed vs .h拡張ヘッダー)

iostreamiostream.hなどの違いに関する情報を見てきました。それらから私が集めたものから、それらの違いは、.h拡張子のないバージョンは名前空間に値を入れないが、拡張子のあるバージョンは値を入れることです。

これはcmath vs math.hでも同じですか?なぜcmath(およびそれに類似した他の多くのファイル)には、単にcの代わりにmathがプレフィックスとして付けられているのですか?それらの間にさらに違いはありますか?

55
golmschenk

Iostreamとiostream.hのようなものの違いに関する情報を見てきました。

[iostream.h]は標準ヘッダーではありません。

あなたが提起している問題の例ではありません。

[cmath]は、std名前空間のシンボルを定義し、グローバル名前空間のシンボルも定義できます。 [math.h]は、グローバル名前空間のシンボルを定義し、std名前空間のシンボルも定義できます。前者を含めて非修飾シンボルを使用すると、あるコンパイラではコンパイルできますが、別のコンパイラではコンパイルできません。したがって、[math.h]を使用することをお勧めします。そして、一般的に、そのようなヘッダーのペアでは、[。h]バージョンを使用します。

c ++ 98は、c xxxヘッダーがグローバル名前空間を汚染しないことの正式な保証を提供しました。多分それが定義された理由です。しかし、それは汚染するものより実装するのが少し難しいので、実際には私が知っている標準ライブラリの実装はこの点で標準に従わなかったので、最終的にc ++ 11の現実を反映するように変更されました。

29

たぶんこれは役に立つでしょう:

C++ライブラリには、同じ構造のヘッダーファイルで編成されたC言語ライブラリと同じ定義が含まれていますが、次の違いがあります。

1-各ヘッダーファイルの名前はC言語バージョンと同じですが、「c」プレフィックスが付き、拡張子は付きません。たとえば、C言語ヘッダーファイル<stdlib.h>に相当するC++は、<cstdlib>です。

2-ライブラリのすべての要素は、std名前空間内で定義されます。

c-prefixed vs .h拡張ヘッダー

4
Hani Shams

名前がcで始まるヘッダーは、C標準ライブラリのヘッダーから派生しています。 c接頭辞が削除され、.h接尾辞が追加された対応するヘッダーは、C標準ライブラリヘッダーと同一(またはほぼ同一)です。

<cmath>は、std名前空間の下で関連するシンボルを定義します。 <math.h>はそれらをグローバルに定義します。

(私はそれがそれほど単純ではないことを知りました;アルフの答えを見てください。)

1
Keith Thompson