15

C ++ 11では、名前空間std::で定義されたタイプを使用するかどうかを選択できます。

少なくとも私のコンパイラ(g ++ 4.7)は両方のバリアントを受け入れます。

私の質問は、cstdintのtypedefを使用するための推奨される方法は何ですか。名前空間の有無は?長所と短所は何ですか?それともスタイルの問題だけですか?

したがって、バリアントa):

#include <cstdint>
std::uint8_t n = 21;

resp:

#include <cstdint>
using std::uint8_t;
uint8_t n = 21;

またはバリアントb):

#include <cstdint>
uint8_t n = 21;
4

5 に答える 5

12

std名前空間で宣言された名前を優先します。理由は§17.6.1.3/4(ISO / IEC 14882:2011(E)、C ++ 11)に記載されています。

条項18から30および付録Dに記載されている場合を除き、各ヘッダーcnameの内容は、C標準ライブラリ(1.2)またはC Unicode TRで指定されている、対応するヘッダーの内容と同じである必要があります。.h含める場合。ただし、C ++標準ライブラリでは、宣言(Cでマクロとして定義されている名前を除く)は、名前空間の名前空間スコープ(3.3.6)内にありますstd。これらの名前が最初にグローバル名前空間スコープ内で宣言され、次にstd明示的なusing-declarations(7.3.3)によって名前空間に挿入されるかどうかは指定されていません。

<cなしで名前>ヘッダーの名前を使用する場合std、プログラムは不特定の要件に依存しています。

stdこれは、名前が名前空間にのみ表示されることになっていたC++03以前では異なりました。ただし、実際には、多くの実装ではC標準ライブラリヘッダー<.h>の内容が単純に挿入されstdていたため、これはC++11で対応されていました。C ++ 03標準の対応するセクション(§17.4.1.2/ 4)には次のように書かれています。

第18条から第27条に記載されている場合を除き、各ヘッダーcnameの内容は、ISO / IEC 9899:1990プログラミング言語C(第7節)またはISO / IEC:1990で指定されている、対応するヘッダーの内容と同じでなければなりません。.hプログラミング言語—C修正1:C整合性、(第7節)、必要に応じて、包含によるかのように。ただし、C ++標準ライブラリでは、宣言と定義(Cでマクロとして定義されている名前を除く)は、名前空間の名前空間スコープ(3.3.5)内にありますstd

これに加えて、名前をで修飾std::すると、衝突を回避するのに役立ちます。完全に修飾すると、何が得られるかが正確にわかります。あなたが本当にやろうとしているのusing namespace stdならusing std::something、少なくともあなたができる限り最小限の範囲でそれをしてください。

于 2012-10-29T21:35:07.100 に答える
7

C ++ 11では、C ++標準で明示的に名前が付けられているCヘッダーの場合、次のようになります。

  • <foo.h>バージョンがグローバル名前空間に追加し、名前空間に追加できるようにするには実装が必要ですstd::

  • <cfoo>バージョンで名前空間に追加するには実装が必要であり、グローバル名前空間に追加できますstd::

于 2012-10-29T21:34:46.827 に答える
4

stdヘッダーの名前空間で物事をラップする理由は、<cstdint>名前の衝突を回避するためです。名前の衝突は、発生したときに非常に不快です。ただし、この場合、タイプが他の場所で見つかる可能性はほとんどありません。したがって<stdint.h>、特にこの機能はCに追加される前に導入されたC++ため、<stdint.h>ヘッダーはより古い<cstdint>ため、古いコンパイラで使用できるため、を使用します。

これらの名前をグローバル名前空間に含めることにした場合は、その後に続けることもお勧め<stdint.h>します。後者は、グローバル名前空間に含めた他のヘッダーから他のすべてのものをダンプするためです。他の多くの標準名は、uint8_tのようなものよりもはるかに衝突しやすいためです。<cstdint>using namespace stdstd<cfoo>

于 2012-10-29T21:42:39.440 に答える
2

インクルード<cstdint>して使用するstd::か、インクルード<stdint.h>して非修飾タイプ名を使用します。<cstdint>グローバル名前空間でこれらのタイプを宣言しないプラットフォーム(QNX SDP 6.6など)がいくつかあります。

于 2018-12-08T00:11:21.153 に答える
1

私の個人的なスタイルは、名前がどこから来たのかが明確になるように、常に完全に名前を修飾することです。つまり、を使用しますstd::uint8_t。つまり、<cstdint>修飾名を含めて使用します。

とは言うものの、の使用は、正確に8ビットstd::uint8_tの型を使用することを本当に意図している場合にのみ示されることに注意してください。コードを実行しているプラ​​ットフォームにそのようなタイプがない場合、たとえば、基本エンティティとして9ビット単位を使用しているため、プログラムはコンパイルされないはずです。使用可能な8ビットで最小のものを使用する場合は、を使用します。unsigneduint_least8_t

于 2012-10-29T21:35:04.093 に答える