在C ++中声明但未定义的静态函数

我使用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 + +” ,但不明白这个代码有什么问题。

在C ++中, static在全局/命名空间范围意味着函数/variables仅用于定义的翻译单元,而不用于其他翻译单元。

在这里,您尝试使用来自不同翻译单元( Main.cpp )的静态函数,而不是其定义的文件( File.cpp )。

删除static ,它应该工作正常。

更改

 static int GetInteger(); 

 int GetInteger(); 

在这种情况下static给出的方法内部linkeage ,这意味着你只能在你定义它的翻译单位使用它。

你可以在File.cpp定义它,然后尝试在main.cpp使用它,但是main没有定义它,因为你声明了它是static

因为在这种情况下, static意味着函数名称具有内部链接; 一个翻译单元中的GetInteger与任何其他翻译单元中的GetInteger无关。 关键字static被重载:在某些情况下,它会影响生命周期,而在其他情况下则是绑定。 这里特别令人困惑,因为“静”也是一生的名字。 在名称空间范围声明的函数和数据总是具有静态生命周期; 当static出现在他们的声明时,它会导致内部绑定,而不是外部。

如果一切都在同一翻译单位,它应该工作。 您可能没有将File.cpp编译成与Main.cpp相同的单元。

 g++ -Wall File.cpp Main.cpp 

如果每个文件都单独编译,则必须使用extern函数从不同的翻译单元使用。

 extern int GetInteger(); 

这是一样的

 int GetInteger(); 

函数声明为静态arelocal包含文件。 因此,您必须在与调用它的文件相同的文件中定义函数。 如果你想从其他文件调用它,你不能声明它是静态的。

根据我的理解,静态函数的名字被定义为文件名,所以当你在main.cpp中包含file.h时,尽pipe你已经在file.cpp中定义了GetInteger(),GetInteger因为它是静态的,所以它也会被破坏,链接器不能findGetInteger()的定义,因为这个名字不存在。

我相信,经验教训是不要在头文件中声明静态函数,因为它们并不是接口的一部分。