2

OpenGLを使用してC++で簡単なプログラムを作成しました。私が必要としているのは、同じ値を保持する2つのファイル( main.cppfuncs.cpp )にいくつかのグローバル変数を含めることです。funcs.h ( main.cppにも含まれています)でこれらの変数を宣言しようとすると、次のエラーが発生しました。

1>main.obj : error LNK2005: "int myVariable" (?myVariable@@3HA) already defined in funcs.obj
1>Path to my program : fatal error LNK1169: one or more multiply defined symbols found

これは、funcs.cppとmain.cppに変数を作成するため、非常に明白です。この方法で変数を宣言しようとしたとき:

//funcs.cpp
int myVariable;

//main.cpp
int myVariable;

そして、それらは両方ともグローバルであり、上記とまったく同じエラーが発生します。私が興味を持ったのは、両方の変数が反対のファイルに表示されないことです。それでは、同じ名前の変数を使用するのはなぜ間違っているのでしょうか。私の知る限りmyVariable、main.cppからfuncs.cppで参照したり、逆にしたりすることはできません。そして私の2番目の質問は-私の問題を解決するための最良の方法は何ですか?私がしたことはこれらの変数のいくつかの名前を変更し(それらの多くがあります)、setNewValue(int newValue)main.cppから呼び出すことができるような関数をfuncs.cppに追加するだけですしかし、正直に言うと、私はそれを誇りに思っていません。

私はMicrosoftVisualStudio 2012、C ++/OpenGLを使用しています。

4

3 に答える 3

6

C ++の使用:

  • 2つのファイル間でグローバル変数を共有しようとしている場合は、現在行っているように、一方のファイル( main.cなど)で宣言し、もう一方のファイルで変数をとして宣言しますextern。このように、変数は1つのファイルで宣言されており、同じ変数を他のファイルで使用でき、その変数の複数の定義で問題が発生することはありません。

  • 各ファイルで同じ名前のグローバル変数を使用して、ファイルがその変数を共有しないようにする場合は、匿名の名前空間を使用して変数の表示を制限します。

    namespace
    {
        int myVariable;
    
        // ...
    

標準C:完全を期すために、標準Cを使用している場合、名前空間を使用して変数の表示を制限する代わりに、staticキーワードを使用できます:上記のように、同じ名前のグローバル変数を使用する場合各ファイルで、ファイルがその変数を共有したくない場合は、それらをとして宣言する必要があります。これにより、現在のファイルに対する可視性が制限されます。static

を使用してグローバルを共有することはextern、Cでも同様に機能します。

于 2012-10-15T17:44:31.810 に答える
2

デフォルトでは、グローバルスコープの変数は他のすべての変換ユニットで使用できます。他の変換ユニットは、extern int myVariableそのグローバル変数にアクセスするためにのみ使用する必要があります。したがって、通常、すべてのユニットに表示されるグローバル変数を作成するには、extern宣言をヘッダーファイルに入れ、変数宣言自体を1つの.c/.cppファイルに入れます。

そのファイルでのみ変数にアクセスできるようにする場合はstatic、グローバルスコープで宣言します。

static int myVariable;
于 2012-10-15T17:44:20.360 に答える
0

いくつかの架空の3番目のファイルが宣言myVariableを使用してアクセスする可能性があるため、これは合法ではありません。externその時点で、コンパイラは、extern宣言がfuncs.cppの変数を参照しているか、main.cppの変数を参照しているかを認識していません。

于 2012-10-15T17:44:48.910 に答える