80

C++を使用した次のコードからエラーが発生します。

Main.cpp

#include "file.h"

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

File.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.

有名な記事「CおよびC++でのコードファイルの整理」を読みましたが、このコードの何が問題になっているのかわかりません。

4

7 に答える 7

140

C++ では、staticグローバル/名前空間スコープでは、関数/変数が定義されている翻訳単位でのみ使用され、他の翻訳単位では使用されないことを意味します。

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

を削除するstaticと、正常に動作するはずです。

于 2012-05-30T08:41:40.620 に答える
26

変化する

static int GetInteger();

int GetInteger();

staticこの場合、メソッドinternal linkeageを指定します。つまり、それを定義した翻訳単位でのみ使用できます。

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

于 2012-05-30T08:41:12.533 に答える
8

この場合、static関数の名前に内部リンケージがあることを意味するためです。ある翻訳単位では、他の翻訳単位GetIntegerとは無関係です。GetIntegerキーワードstaticはオーバーロードされています。場合によっては寿命に影響し、他の場合はバインドに影響します。「静的」はライフタイムの名前でもあるため、ここでは特に混乱します。名前空間スコープで宣言された関数とデータには、常に静的な有効期間があります。宣言にstatic現れると、外部ではなく内部バインディングが発生します。

于 2012-05-30T08:45:45.397 に答える
4

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

于 2012-05-30T08:42:25.857 に答える
3

私の理解では、静的関数はそれらが定義されているファイル名で名前がマングルされているため、main.cppにfile.hをインクルードすると、file.cppでGetInteger()を定義していても、GetInteger()はmain.cppでマングルされます。静的であるため、それもマングルされ、この名前の関数が存在しないため、リンカーはGetInteger()の定義を見つけることができません。

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

于 2012-05-30T08:47:58.500 に答える
3

すべてが同じ翻訳単位にある場合は、機能するはずです。File.cpp を Main.cpp と同じユニットにコンパイルしていない可能性があります。

g++ -Wall File.cpp Main.cpp

各ファイルが個別にコンパイルされる場合、関数はextern異なる翻訳単位から使用されるように作成する必要があります。

extern int GetInteger();

これはと同じです

int GetInteger();
于 2012-05-30T08:45:33.593 に答える