「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ で `cstdio` が含まれているときに `printf` が `std::` なしで動作するのはなぜですか?

C++ で `cstdio` が含まれているときに `printf` が `std::` なしで動作するのはなぜですか?

2024 年 11 月 17 日に公開
ブラウズ:909

 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 が含まれているためです。

include stdio.h

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

互換性機能

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

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

結論

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3