2012-05-30 33 views
49

C++を使用して次のコードからエラーが発生します。静的関数は宣言されていますが、C++で定義されていません

MAIN.CPP

#include "file.h" 

int main() 
{ 
    int k = GetInteger(); 
    return 0; 
} 

ファイル.h

static int GetInteger(); 

File.cpp

#include "file.h" 

static int GetInteger() 
{ 
    return 1; 
} 

私が取得エラー:

Error C2129: static function 'int GetInteger(void)' declared but not defined. 

私は有名な記事"Organizing Code File in C and C++"を読んだが、このコードで間違っているものを理解していません。

+2

どのようにリンクしていますか? "gcc -o Test Main.cpp File.cpp -lstdC++"またはXCode/VisualStudio/Eclipseのどこか? –

+1

@ViktorLatypovは言った。コンパイル方法を教えてください。 – Brady

+0

私はVisual Studioを使用しています。 – Sait

答えて

92

グローバル/ネームスペーススコープのstaticは、関数/変数が定義されている変換単位でのみ使用され、他の変換単位では使用されないことを意味します。

ここでは、定義されているもの(File.cpp)以外の異なる翻訳単位(Main.cpp)の静的関数を使用しようとしています。

staticを削除しても問題ありません。

19

変更

static int GetInteger(); 

この場合

int GetInteger(); 

staticにあなただけがそれを定義する翻訳単位でそれを使用することができることを意味し、この方法内部linkeageを与えます。

File.cppで定義し、main.cppで使用しようとしましたが、メインにはstaticと宣言しているため、定義がありません。

1

静的なものとして宣言されている関数は、そのファイルを含むものです。したがって、関数を呼び出す人と同じファイルに関数を定義する必要があります。他のファイルから呼び出し可能にする場合は、静的として宣言してはいけません。

2

すべてが同じ翻訳単位に含まれている場合、動作するはずです。 おそらく、Main.cppと同じユニットにFile.cppをコンパイルしなかったでしょう。

g++ -Wall File.cpp Main.cpp 

各ファイルが別々にコンパイルされている場合は機能がexternが 異なる翻訳単位から使用されるようになされなければなりません。この場合、static関数の名前は 内部結合を有することを意味するので

int GetInteger(); 
+0

彼はg ++ではなくVisual Studioを使用しています – Brady

6

同じである

extern int GetInteger(); 

。 1つの翻訳単位内のGetIntegerは他の翻訳単位では無関係です 〜GetIntegerです。キーワードstaticは、 がオーバーロードされています。場合によっては、有効期間に影響を及ぼします。 「静的」は生涯の の名前でもあるため、特に混乱します。名前空間のスコープで宣言された関数とデータは、常に に静的な有効期間があります。その宣言にstaticが現れると、 は外部の代わりに内部バインディングを引き起こします。

1

私が理解しているように、静的関数は定義されているファイル名で名前が変わるので、main.cppにfile.hを含めると、GetInteger()はmain.cppでマングルされます。 file.cppでも静的なので、この名前で関数がないので、リンカはGetInteger()の定義を見つけることができません。

私は、インターフェイスの一部ではないため、ヘッダファイルに静的関数を宣言していないことを学んだと思います。

関連する問題