<cstdint>と<stdint.h>


94

違いは何である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か?

OS X 10.8には欠けてい<cstdint>ます。受け取るエラーは次のとおり./misc.h:7:10: fatal error: 'cstdint' file not foundです。
jww

回答:


122

C ++ 98の本来の目的は<cstdint>、グローバルネームスペースの汚染を避けるためにC ++で使用することでし<cstdint>た(特に、C ++ 11だけでなく、<c*>ヘッダー全般で追加されています)。

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

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

実際には、煩わしい大量のコードが最後のオプションを使用しているのではないかと思い<cstdint>ます。これは、シンボルをグローバル名前空間に配置する実装で偶然に簡単に実行できるためです。最初のものを使用してみてください。2つ目の利点は、おそらくそれを行うだけでなく、グローバル名前空間にものを入れることが保証されていることです。それは特に便利だとは思いませんが、それがあなたの優先順位である場合、それはいくつかの入力を節約するかもしれません。

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 ++グローバル名前空間で予約済みとして扱うことも完全に愚かな考えではありませんが、必須ではありません。


残っている唯一の未回答の質問は、ヘッダーファイルの命名規則に関するものです。このトピックについて知っていますか?
PaperBirdMaster

24
@PaperBirdMaster:C ++標準ライブラリのヘッダーには、ファイルの拡張子を持っていない:<iostream><vector><cstdlib>、別にCとの互換性を保つためにものから:<stdint.h><stdlib.h>。そしてはい、イニシャルcは、C ++のように完全に新しいというより<cstdlib>は、C ++がC標準ヘッダーに相当することを示しています。C ++ヘッダーがあるので、C の将来のバージョンで標準ヘッダーが導入されないことを期待する必要があります。<stdlib.h><vector><complex><omplex.h>
Steve Jessop、

@SteveJessop Erm、C99?
SS Anne、

1
@ JL2210は彼が言ったの<omplex.h>ではなく、気づいた<complex.h>。Cが追加された<omplex.h>場合、C ++の同等物は次のようになります<complex>
John Leuenhagen

16

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

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

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

#include <cstdint>

std::
Cで使用するシンボル名を完全に修飾します。

#include <stdint.h>

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

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

1 C標準ライブラリおよびC Unicode TRとの互換性のために、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宣言(7.3.3)によってグローバル名前空間スコープに注入されるかどうかは指定されていません。

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


-1
  1. cstdintC ++ 11ヘッダー、stdint.hC99ヘッダー(CとC ++は異なる言語です!)

  2. MSVC 2008にはもも含まれていstdint.hませんcstdint

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


2
3.間違っています。cstdint実装を名前空間に引き上げる必要がありますstd
Konrad Rudolph、

1
1.も間違っています。stdint.hは、C ++標準の標準付属書DのC ++ライブラリの一部として定義されています。

@ chill、Annex Dへのリンクを提供していただけませんか?ここでen.cppreference.com/w/cpp/types/integerはC ++ 11ヘッダーであることを述べています。
hate-engine

1
@ hate-engine、C ++標準のコピーで調べることをお勧めします。そのcppreferenceページは言及していませんstdint.hcstdintC ++ヘッダーである引数はありません。

2
1.の部分はfalseではありません。まとめるとstdint.h、C ++ 11の一部ではないように見えます。実際、C ++ 11では必須です。「intC ++ 11にlongある、C99にある、CとC ++は異なる言語です!」と言うこともできますが、そのいずれの部分も誤りではありません。ただし、C ++ 11はC99を参照してstdint.handとの両方のコンテンツを定義しているが、cstdintCを参照してを定義していないため、私の例はさらに誤解を招きますint
Steve Jessop、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.