105

stdint.hとの違いは何cstdintですか?

どちらもMSVC(Visual Studio 2010)とgcc-4.5.1で利用できます。また、両方ともintX_t/uintX_tタイプを定義します(ここXで、はタイプのバイト単位のサイズです)。

  • 両方のヘッダーの論理的根拠が同じである場合(ポータブルタイプ)、どちらかを決定するためにどのような決定を行う必要がありますか?

stdint.h名前空間なしで各タイプを定義し、cstdintタイプはstd名前空間にあります。

  • std定義された型を名前空間に含める、または含めない理由はありますか?2つのヘッダーの違いは何ですか?

cstdintファイル拡張子がなく、cプレフィックスをstdint.h使用し、.h拡張子を使用します。

  • このヘッダーの命名規則は何ですか?cプレフィックスは、これがCライブラリであることを示していますか?にファイル拡張子がないのには理由がありますcstdintか?
4

3 に答える 3

133

C ++ 98の本来の意図は<cstdint>、グローバル名前空間を汚染しないようにC ++で使用することでした(<cstdint>特に、C ++ 11でのみ追加されますが、<c*>ヘッダーは一般的に追加されます)。

ただし、実装はとにかくシンボルをグローバル名前空間に配置することに固執し、C++11はこの慣行を承認しました[*]。したがって、基本的に3つのオプションがあります。

  • 使用<cstdint>して、使用する各整数型を完全に修飾するか、using std::int32_t;etcでスコープに入れます(冗長であるため面倒ですが、C ++標準ライブラリの他のシンボルと同じように行うのが正しい方法です)
  • 使用<stdint.h>(非推奨のため少し悪い)
  • 実装がシンボルをグローバル名前空間に配置することを使用<cstdint>して想定します(保証されていないため、非常に悪いです)。

<cstdint>実際には、シンボルをグローバル名前空間に配置する実装で偶然に実行するのが簡単であるという理由だけで、迷惑な大量のコードが最後のオプションを使用しているのではないかと思います。最初に使用してみてください。2つ目は、たぶんそれを行うのではなく、グローバル名前空間に何かを入れることが保証されているという1つの利点があります。これは特に便利だとは思いませんが、それが優先される場合は、タイピングを節約できる可能性があります。

4番目のオプションがあり、#include <cstdint>その後にusing namespace std;役立つ場合がありますが、を入れてはいけない場所がありますusing namespace std;。それらの場所がどこにあるかは人によって異なりますが、「ヘッダーファイルのトップレベル」は「cppファイルのトップレベル」よりも悪く、「限られた範囲内」よりも悪くなります。まったく書かない人もusing namespace std;います。

[*]これは、C ++標準ヘッダーがグローバル名前空間にデータを配置することを許可されているが、必須ではないことを意味します。したがって、これらのシンボルとの衝突を回避する必要がありますが、実際にはシンボルが存在しない可能性があるため、それらを使用することはできません。基本的に、C++のグローバル名前空間は地雷原です。避けてください。using namespace std;委員会は、ヘッダーファイルのトップレベルに固執するのとほぼ同じくらい有害な実装による慣行を承認したと主張する人もいるかもしれません-違いは、実装はC標準ライブラリのシンボルに対してのみ実行するのに対しusing namespace std;、C++に対しては実行することです-シンボルのみ。C標準には、標準への将来の追加のために予約されている名前をリストするセクションがあります。これらの名前をC++グローバル名前空間でも予約済みとして扱うことは完全に愚かな考えではありませんが、必須ではありません。

于 2012-11-30T10:08:03.087 に答える
17

含めるcstdintと、シンボル名がstd名前空間にインポートされ、場合によってはグローバル名前空間にインポートされます。
含めるstdint.hと、グローバル名前空間および場合によってはstd名前空間にシンボル名がインポートされます。

C標準ライブラリの機能もC++標準ライブラリで提供されており、一般的な命名規則として、C標準ライブラリの対応する名前の前にcが付加されています。

C ++では、次を使用する必要があります。

#include <cstdint>

Cで使用するシンボル名を完全に修飾するには、次を使用std::
する必要があります。

#include <stdint.h>

付録D(規範的)互換性機能[depr]は次のように述べています。

D.6C標準ライブラリヘッダー

1C標準ライブラリおよびCUnicodeTRとの互換性のために、C ++標準ライブラリは、表151に示すように25個のCヘッダーを提供します。

これは含まれて:

<assert.h> <float.h> <math.h> <stddef.h> <tgmath.h> <complex.h> <inttypes.h> <setjmp.h> <stdio.h> <time.h> <ctype.h> <iso646.h> <signal.h> <stdint.h> <uchar.h> <errno.h> <limits.h> <stdarg.h> <stdlib.h> <wchar.h> <fenv.h> <locale.h> <stdbool.h> <string.h> <wctype.h>

そしてさらに、

2 それぞれがフォームの名前を持つすべてのCヘッダーはname.h、対応するものによって標準ライブラリ名前空間に配置された各名前cname headerがグローバル名前空間スコープ内に配置されているかのように動作します。これらの名前が最初に名前空間stdの名前空間スコープ(3.3.6)内で宣言または定義され、次に明示的なusing-declarations(7.3.3)によってグローバル名前空間スコープに挿入されるかどうかは指定されていません。

3 [例:ヘッダー<cstdlib>は、名前空間std内でその宣言と定義を確実に提供します。また、グローバル名前空間内でこれらの名前を提供する場合もあります。ヘッダー<stdlib.h>は、C標準の場合と同様に、グローバル名前空間内で同じ宣言と定義を確実に提供します。また、名前空間std内にこれらの名前を提供する場合もあります。—例を終了]

于 2012-11-30T10:03:08.900 に答える
0
  1. cstdintはC++11ヘッダー、stdint.hはC99ヘッダーです(CとC ++は異なる言語です!)

  2. MSVC2008にはもも含まれていませstdint.hcstdint

  3. の実装はcstdint、ほとんどの場合#include <stdint.h>、いくつかの名前空間/言語の修正が含まれています。

于 2012-11-30T10:03:59.773 に答える