46

の c++ リファレンスから次の行が表示されますcstdio

ライブラリのすべての要素は、std namespace. しかし、私はコードを試しました:

std::printf("hello world"); 

printf("hello world");

C++ ヘッダーが std とグローバル名前空間の両方に名前を入れるというのは本当ですか?

4

2 に答える 2

57

インクルード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 内でこれらの名前を提供することもできます。—終わりの例]

于 2012-05-05T08:50:12.033 に答える
11

libstdc++ ドキュメントによると:

標準では、C スタイルのヘッダー (<math.h>この場合) が含まれている場合、シンボルはグローバル名前空間とおそらく名前空間 std:: で使用できると指定されています (ただし、これはもはや確固たる要件ではありません)。 C++ スタイルのヘッダー ( ) を含めることで、エンティティが名前空間 std およびおそらくグローバル名前空間<cmath>で見つかることが保証されます。

http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch03s02.html

于 2012-05-05T08:51:50.530 に答える