2012-03-07 4 views
3

私は複数のファイルで単一の名前空間を使用していますが、それぞれのファイルの末尾に "main names"を除いて "namespace abc {"と "}"を挿入しました。 コンパイル時には機能しません(システム関数などは認識しません)C++: '#include <files>'の前に名前空間の定義を許可しますか?

「#include」行の後にnamespaceを定義すると、 ここで問題が発生していますか?

答えて

1

#include先行する名前空間の定義は、予期しない結果になる可能性があります。プリプロセッサの言語はc/C++コードと異なり、それらを混在させるとバグを追跡できない場合があります。

+0

Thanx Alexander、 実際にはたくさんのファイルがあり、手動で(つまり、プリプロセッサ宣言の後に)各ファイルに名前空間定義を挿入するのは難しい作業です。それで、私はスクリプトを使って最初にそれらを挿入したのです。 – Dharmendra

5

問題は、ヘッダーを名前空間内に置くことによって、その名前で関数を宣言するようにすることです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関数には影響しません。

+0

それは本当ではない、私は信じています。それを行うと、x :: printfを使用する必要があります。しかし、それはまだOKをリンクします。なぜなら、extern "C"が名前のマングリングに影響を与えるからです。 –

関連する問題