2016-05-13 4 views
0

私は3つのファイルを持っています.1つはアクセスする変数を持ち、もう1つはそれらの変数にアクセスする必要があります。今のところ私は以下のような3つのファイルを持っていて、コンパイル時にエラーが出ています。私はなぜネームスペースを使ってエラーが出るのか理解できません。インクルードヘッダファイルから変数にアクセスする方法

がheader.h

extern int i; 

a.cpp

#include "header.h" 
#include "mheader.h" 
namespace s{ 
    int i=10; 
    struct p{ 
    p(){ 

    } 
    }; 
} 

b.cpp

#include "a.cpp" 
int main(){ 
    cout<<i; 
} 

私は名前空間宣言を開始する前に、変数iを定義する定義した場合でも、それはありません内部ネームスペースでアクセス可能。名前空間とbの変数にアクセスできる方法はありますか?

+3

'i'と' s :: i'は同じものではありません。無関係です。 – songyuanyao

+0

名前空間宣言を開始する前に定義していても、名前空間内ではアクセスできません。名前空間とbの変数にアクセスできる方法はありますか? –

+0

CPPファイルを '#include 'しているのはなぜですか? – Ajay

答えて

1

この方法で修正できます。

がheader.h

namespace s 
{  
extern int i; 
} 

b.cpp

#include "a.cpp" 
    int main() 
    { 
     cout<<s::i; 
    } 

しかし、あなたはより良いそれをよく理解して!

+0

これはキーワードexternを使用しない場合でも有効です。しかし、そのコードがなぜ機能していないのか説明できれば。そのプロジェクトの複数のファイルで使用できる大きなプロジェクトの多くの変数を扱うことができる他のヘッダーファイルを作成するような緊急性があるような場合に、実際に悪いことが起こった場合には、どうすればよいか分かります。 –

+2

:あなたは 'C:\ abc \ file.txt'にファイルを置きましたが、' c:\ file.txt'のようにファイルを読み込もうとしています。存在しない 'c:\ file.txt'ファイルへのショートカットとして' extern'を考えてみましょう。 – Ajay

2

名前空間は名前のための別のスペースです。 1つの名前空間内の名前は、特に明記されていない限り、別の名前空間内の名前とはまったく異なる変数(または型など)を参照します。グローバル名前空間で宣言された

extern int i(完全修飾名が::iです)(完全修飾名がs::iある)名前空間sで定義されたint iとは異なる変数です。このように

、あなたがこのheader.hで宣言さ::iを定義されていないとb.cpp

で使用される決してあなたの意図が何であるかに応じて、2つの潜在的な解決策があります。 a.cppまたはb.cppのグローバル名前空間にint iを定義することができます。その場合は、どこでも使用されていないと思われるs::iを取り除きたいかもしれません。

または、b.cppにs::iを使用できます。その場合は、::iの宣言を取り除き、どこにも使用されないようにすることができます。

傍注として、a.cppを含むことが最も間違いである可能性があります。 a.cppとb.cppの両方からコンパイルされたオブジェクトファイルをリンクしようとすると、1つの定義ルールに違反することになります。

関連する問題