5

通常、次のように、C++ の標準ライブラリ ヘッダーをexterns の外側のグローバル名前空間に含めます。

#include <stdint.h>

int main() { }

しかし、標準ライブラリ ヘッダーを 1 つの中に含めると、何が起こるように指定されているのでしょうか? 例えば:

extern "C" {
#include <stdint.h>
}
int main() { }

また

extern "C++" {
#include <stdint.h>
}
int main() { }

どちらの場合も何が起こるかが指定されていますか、それとも実装定義または未定義ですか?

C++11 17.6.2.3p1 によると、C++ 標準ライブラリ ヘッダーextern "C++"<stdint.h>. #includeC++11 17.6.2.2p3 は、ヘッダーは「外部宣言」の外でのみ d できると述べています。このフレーズは C++11 ではこの 1 か所にしか現れないため、ここに当てはまるかどうかはわかりません。(C99はこれについて何も言わないと思います。)

(私の特定のケースでは、C++ の標準ヘッダーを使用するオプションではない<c*>ため、古い学校の C ヘッダーのセマンティクスのみを知る必要があります。)

4

1 に答える 1

5

標準は、C++ の一部ではない C ヘッダーについて何も述べていません。C++-11 より前は、stdint.h/cstdintは C++ の一部ではありませんでした。C++ コードからインクルードした場合の動作は、そのヘッダー次第です。

C++ の一部であるC ヘッダーについて質問している場合、 と の唯一の違いは*.hc*前者はその識別子をstd名前空間に追加する必要がないことです (そうするかどうかは任意ですが)、後者は必須です。これを行うには (オプションでそれらをグローバル名前空間に追加することもできます)。他に違いはありません。ヘッダー自体が必要に応じて C リンケージを使用するため、ブロック内に標準*.hヘッダーを含めないでください。extern "C"

C++ コードからインクルードする非標準の C ヘッダーがある場合は、それらのヘッダーを調べて、それらをインクルードする必要があるかどうかをextern "C"ケースバイケースで判断する必要があります。

于 2012-12-04T18:37:02.277 に答える