私は複数のファイルで単一の名前空間を使用していますが、それぞれのファイルの末尾に "main names"を除いて "namespace abc {"と "}"を挿入しました。 コンパイル時には機能しません(システム関数などは認識しません)C++: '#include <files>'の前に名前空間の定義を許可しますか?
「#include」行の後にnamespaceを定義すると、 ここで問題が発生していますか?
私は複数のファイルで単一の名前空間を使用していますが、それぞれのファイルの末尾に "main names"を除いて "namespace abc {"と "}"を挿入しました。 コンパイル時には機能しません(システム関数などは認識しません)C++: '#include <files>'の前に名前空間の定義を許可しますか?
「#include」行の後にnamespaceを定義すると、 ここで問題が発生していますか?
#include
先行する名前空間の定義は、予期しない結果になる可能性があります。プリプロセッサの言語はc/C++コードと異なり、それらを混在させるとバグを追跡できない場合があります。
問題は、ヘッダーを名前空間内に置くことによって、その名前で関数を宣言するようにすることですespace - しかし、それらの関数の定義(実装)はその名前空間に存在しないので、リンクすると見つからず、リンクが失敗します。
具体的な例を挙げて、関数を宣言したヘッダがあるとします。int f(int)
名前空間の中括弧の中にそれを囲むことで、それをint somenamespace::f(int)
の宣言に変換します。
int ::f(int)
が定義されていますが、int somenamespace::f(int)
はありませんので、リンクすることはできません。
extern "C"
機能には該当しません。彼らは基本的に名前空間を無視するので、(例えば)のような何か:
namespace x {
#include <stdio.h>
}
がstdio.h
で、通常のC関数には影響しません。
それは本当ではない、私は信じています。それを行うと、x :: printfを使用する必要があります。しかし、それはまだOKをリンクします。なぜなら、extern "C"が名前のマングリングに影響を与えるからです。 –
Thanx Alexander、 実際にはたくさんのファイルがあり、手動で(つまり、プリプロセッサ宣言の後に)各ファイルに名前空間定義を挿入するのは難しい作業です。それで、私はスクリプトを使って最初にそれらを挿入したのです。 – Dharmendra