2013-02-14 10 views
8

は、私はC++にビット新たなんだと私はすでに行われたファイルの多くのコーディングの割り当てを持っているが、私はVS2012は、次の文に問題があるように見えることに気づきましたエラーを取り除くなぜstd :: uint32_tとuint32_tが異なるのですか?しかし、</p> <p><code>typedef std::uint32_t identifier;</code></p> <p>:

typedef uint32_t identifier;

に変更するようです。インクルードはありません。これはヘッダーファイルにあります。私は定義がstdint.hにあることに気づいた。その場合、なぜこのコードはVSの外で受け入れられますか(つまり、g ++を使って適切にコンパイルします)、VSでは受け入れられません。誰もこれを説明できますか?

+0

VS 2010でエラーです。UIをインストールするにはあまりにも使い物にならなかったため、VS 2012をテストできません。 –

+4

std名前空間のものを取得するには 'cstdint'をインクルードする必要があります – Caesar

+1

@CodyGray OPがVS2012を使用しているように見えるので、UIは使用できません。 –

答えて

10

違いは、名前空間内にあり、もう一方は名前空間内にないことです。それ以外の場合は同じでなければなりません。最初のバージョンはCバージョン、2つ目はC++バージョンです。 C++ 11以前では、C標準ライブラリの代わりに接頭辞付きのバージョンを含めると、標準名前空間内のすべてのCの定義が取り込まれることが義務づけられました。 C++ 11では、これは常に可能ではないので、この制限は緩和されています。

コンパイラがこの型を暗黙的に定義している可能性があります。いずれにしても、cstdintを含めると、ネームスペースstdのバージョンを使用可能にする必要があります(また、グローバル名前空間内のバージョンも可能)。 stdint.hを含めると、正規化されていないバージョンを使用できるようにするだけです。

以前のバージョンのVisual Studioはこのヘッダーなしで出荷されていたため、煩雑になる可能性があります。

このような狂気のため、ほとんどの人は、boost/cstdint.hppなどのサードパーティの実装に後退します。

編集:これらは同じで、同じ目的を果たします。原則として、std名前空間のバージョンを使用する場合は、cstdintを含めます。グローバル名前空間に1つを使用する場合は、stdint.hを含めます。 C++の場合は、std名前空間にあるものを使用することをお勧めします。原則として、常にあなたが使っているものを含め、あなたのためのものを含む他のヘッダーに頼らないでください。

+0

しかし、基本的に、その機能は同じですか? – Lunyx

+0

@ダニエルはい。私はもっ​​と強調しておくべきだった。コンパイルされたコンパイラに関するすべての話は、おそらく参考になるよりも混乱しているでしょう。 – pmr

7

uint32_t(別名::uint32_t)は、<stdint.h>で宣言されています。そのヘッダーstdのようにstd::uint32_tという名前空間に宣言しますが、必須ではありません。

std::uint32_t(つまり、名前空間stdのもの)は、<cstdint>で宣言されています。そのヘッダーもグローバル名前空間でそれを::uint32_tとして宣言することができますが、必ずしもそうする必要はありません。

この場合、なぜこのコードはVSの外部で受け入れられる(つまり、g ++を使用して正しくコンパイルされますが)VSでは受け入れられないのですか?誰もこれを説明できますか?

std::uint32_tを使用する場合は、#include <cstdint>を使用する必要があります。コードがコンパイルされないことがあります。 G ++でコンパイルする場合、間接的に他のヘッダに間接的に<cstdint>が含まれていますが、これに頼るべきではなく、使用する名前に適切なヘッダを含めてください。

関連する問題