在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()的定义,因为这个名字不存在。
我相信,经验教训是不要在头文件中声明静态函数,因为它们并不是接口的一部分。