1. ホーム
  2. c++

[解決済み] C++でC言語のヘッダーを使う場合、std::とグローバル名前空間のどちらから関数を使うべきでしょうか?

2022-05-14 08:46:43

質問

C言語はC++のサブセットです。ですから、名前を少し変えることで、C++でCの関数/ヘッダのほとんどを使うことができます( stdio.hcstdio , stdlib.h から cstdlib ).

私の質問は、実際には意味的なものです。C++コード(GCCコンパイラの最新バージョンを使用)において、私は以下を呼び出すことができます。 printf("Hello world!");std::printf("Hello world!"); で、全く同じように動作します。そして、私が使っているリファレンスでは、次のように表示されます。 std::printf("Hello world!"); .

質問ですが std::printf(); を使用する方が良いのでしょうか?違いがあるのでしょうか?

どのように解決するのですか?

C++11 Standard から(強調)。

D.5 C標準ライブラリヘッダ [depr.c.headers]

  1. C標準ライブラリとの互換性のために...
  2. すべてのCのヘッダは、それぞれ、以下のような形式の名前を持っています。 name.h という形式の名前を持つすべてのCのヘッダは、対応する標準ライブラリ によって標準ライブラリの名前空間に置かれた各名称は、対応する cname ヘッダによって標準ライブラリ名前空間に置かれた各名称は グローバル名前空間 スコープ内に配置されます。これは これらの名前が最初に宣言されるか、名前空間スコープ内で定義されるかは不特定です。 (3.3.6) 名前空間が std であり、その後、明示的なusing宣言によってグローバルな名前空間スコープに注入されます (7.3.3)。
  3. 例です。 ヘッダ <cstdlib> 確実 はその宣言と定義を提供します。 を名前空間 std . また、グローバル名前空間内でこれらの名前を提供することもできます。ヘッダ <stdlib.h> 確実 は、同じ宣言と定義を提供する をグローバル名前空間内で を提供します。また また、これらの名前を名前空間 std .

name.h" ヘッダの使用は非推奨です。将来のリビジョンで削除される候補として特定されました。

そこで、"cname" ヘッダを含めるようにし、宣言と定義を std 名前空間の宣言と定義を使用することをお勧めします。

何らかの理由で "name.h" ヘッダを使用しなければならない場合(非推奨、上記参照)、グローバル名前空間からの宣言と定義を使用することをお勧めします。

言い換えれば、好む

#include <cstdio>

int main() {
    std::printf("Hello world\n");
}

以上

#include <stdio.h>

int main() {
    printf("Hello world\n");
}