ホームページ  >  記事  >  バックエンド開発  >  C で `cstdio` が含まれている場合に、なぜ `printf` が `std::` なしで動作するのでしょうか?

C で `cstdio` が含まれている場合に、なぜ `printf` が `std::` なしで動作するのでしょうか?

DDD
DDDオリジナル
2024-10-26 01:13:02696ブラウズ

 Why Does `printf` Work Without `std::` in C   When `cstdio` is Included?

cstdio stdio.h 名前空間

cstdio の C リファレンスには、「ライブラリのすべての要素は std 名前空間内で定義されている」と記載されています。ただし、std::printf と printf の両方が機能することがわかり、C ヘッダーに両方の名前空間のシンボルが含まれるかどうかという疑問が生じます。

答えはさらに微妙です。

cstdio を含む

cstdio を含めると、シンボルが std 名前空間にインポートされ、場合によってはグローバル名前空間にもインポートされます。これは、cstdio には C スタイルのヘッダーである stdio.h が含まれているためです。

stdio.h をインクルード

stdio.h をインクルードすると、シンボルがグローバル名前空間にインポートされ、おそらく std 名前空間に追加されます。これは、stdio.h が C スタイルのヘッダーであるためです。

互換性機能

C での C スタイルのヘッダーの使用は互換性機能です。 C 11 標準では、C 標準ライブラリとの互換性のために、C 標準ライブラリが cstdio や stdio.h を含む 25 個の C ヘッダーを提供することが指定されています。

この標準ではさらに、各 C ヘッダーは「それぞれの名前であるかのように動作する」と規定されています。対応する cname ヘッダーによって標準ライブラリの名前空間に配置されたものは、グローバル名前空間のスコープ内に配置されます。

結論

要約すると、C に C スタイルのヘッダーを含める場合、 、使用されている特定のヘッダーとコンパイラの実装に応じて、シンボルは std 名前空間とグローバル名前空間の両方にインポートされる場合があります。ただし、両方の名前空間に同じシンボルが含まれることが常に保証されるわけではありません。

以上がC で `cstdio` が含まれている場合に、なぜ `printf` が `std::` なしで動作するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。