の c++ リファレンスから次の行が表示されますcstdio
。
ライブラリのすべての要素は、std namespace
.
しかし、私はコードを試しました:
std::printf("hello world");
printf("hello world");
C++ ヘッダーが std とグローバル名前空間の両方に名前を入れるというのは本当ですか?
インクルードcstdio
すると、シンボル名がstd
名前空間にインポートされ、場合によってはグローバル名前空間にインポートされます。
インクルードstdio.h
すると、シンボル名がグローバル名前空間にインポートされ、場合によっては名前空間にインポートされstd
ます。
同じことがすべての c スタイルのヘッダーに適用されます。
参考:
C++11標準
附属書 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 内でこれらの名前を提供することもできます。—終わりの例]
libstdc++ ドキュメントによると:
標準では、C スタイルのヘッダー (
<math.h>
この場合) が含まれている場合、シンボルはグローバル名前空間とおそらく名前空間 std:: で使用できると指定されています (ただし、これはもはや確固たる要件ではありません)。 C++ スタイルのヘッダー ( ) を含めることで、エンティティが名前空間 std およびおそらくグローバル名前空間<cmath>
で見つかることが保証されます。
http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch03s02.html