2016-11-22 10 views
0

コードはエラーなしでコンパイルされますが、名前空間の内部と外部の宣言関数の違いは何ですか?extern関数を名前空間を指定しないで呼び出す

--a.h--

namespace mynamespace { 
    extern void foo(); 
} 

--a.c--

namespace mynamespace { 
    void foo(){ 
     dosomething; 
    }; 
} 

私は 指定した名前空間なしのfoo()を呼び出すときに心配する必要があります任意の懸念はありますか?

#include "a.h" 
int main(int argc char *argv) 
    foo() 
} 

代わりの

#include "a.h" 
int main(int argc char *argv) 
    mynamespace::foo(); 
} 
+3

* "名前空間を指定せずにfoo()を呼び出すと心配する必要はありませんか?" *試してみると、非常に早く見つけることができます。コンパイラはあなたのコードについて何を考えているかを教えてくれます。 –

+0

@IgorTandetnik変わったことは、私のコンパイラが警告やエラーを表示していないことです。私はdebainにgcc-4.9を使用しています。 –

+0

'main'を含む翻訳単位は、次のように[コンパイルできません](http://rextester.com/UQO84160)。そうであれば、グローバル名前空間で 'foo'の宣言を提供するか、またはあなたが表示していないコードのどこかで' using namespace mynamespace;または 'mynamespace :: foo;を使用します。 –

答えて

0

それはusing namespace mynamespace;がすでに他のヘッダファイルで宣言されていることが判明しました。したがって、1つのファイルにすでにusing namespace mynamespace;が定義されているヘッダーファイルが含まれている場合は、現在のヘッダーファイルも影響を受けます。

関連する問題