2
FileA.hpp:

static int a; 
void change(int);

FileA.cpp

#include "FileA.hpp"
void change(int x) { a = x; }

main.cpp

#include "FileA.hpp"
#include <cstdlib>
#include <iostream>

int main()
{
    a = 5;
    std::cout<<a<<std::endl;
    change(10);
    std::cout<<a<<std::endl;
    a = 20;
    std::cout<<a<<std::endl;

    system("Pause");

    return 0;
}

私の出力は次のとおりです。

5
5
20

誰かがこれで私を助けることができますか? FileA.cpp にある関数で変数 'a' を変更したくないのはなぜですか。これを修正する方法。「FileA.hpp」で change(int x) インラインを作成すると、正常に動作します。

4

2 に答える 2

15

グローバル変数のstaticキーワードは、その変数の内部リンケージを提供します。これは、その定義を持つ翻訳単位には、オブジェクトの独自のコピーがあることを意味します。したがって、見るa対象とmain.cpp見る対象FileA.cppは別の対象です。changeそれらの1つを変更しますが、もう1つをmain出力します。

オブジェクトの保存期間が静的であることを意図staticしていた場合、グローバル変数 (または一般的に名前空間スコープの変数) には静的な保存期間があります。それらをマークする必要はありませんstatic。ただし、 を削除するstaticと、別の問題が発生します。a翻訳単位全体の複数の定義があります。

これを行う正しい方法は、ファイルで次のaように宣言することです。externFileA.hpp

extern int a;

次に、単一の翻訳単位で (おそらく でFileA.cpp、オブジェクトを定義します。

int a;

これは、 を含むすべてのオブジェクトが をFileA.hpp宣言しa(これで問題ありません)、1 つの翻訳単位だけが を定義することを意味しaます。完全。

于 2013-04-18T09:33:02.403 に答える
3

ヘッダー ファイルで宣言aします。これを含めると、2 つのコピーが作成されます。1 つは に、もうmain.cpp1 つはFileA.cppです。a = 5;main.cpp からのコピーに代入すると、関数を呼び出すと、FileA.cppchangeのコピーが変更されます。

于 2013-04-18T09:31:17.580 に答える