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

Sai*_*ait 62 c++ static-methods

我使用C++从以下代码中收到错误.

Main.cpp的

#include "file.h"

int main()
{
   int k = GetInteger();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

File.h

static int GetInteger();
Run Code Online (Sandbox Code Playgroud)

File.cpp

#include "file.h"

static int GetInteger()
{
   return 1;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

Error C2129: static function 'int GetInteger(void)' declared but not defined.
Run Code Online (Sandbox Code Playgroud)

我读过着名的文章"用C和C++组织代码文件",但不明白这段代码有什么问题.

HC4*_*ica 119

在C++中,static在全局/命名空间范围内意味着函数/变量仅用于定义它的转换单元,而不是在其他转换单元中.

在这里,您尝试使用来自不同的转换单元(Main.cpp)的静态函数(而不是定义它的那个)(File.cpp).

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


Luc*_*ore 21

更改

static int GetInteger();
Run Code Online (Sandbox Code Playgroud)

int GetInteger();
Run Code Online (Sandbox Code Playgroud)

static在这种情况下,为方法提供内部链接,这意味着您只能在定义它的翻译单元中使用它.

你定义它File.cpp并尝试使用它main.cpp,但main没有它的定义,因为你声明它static.


Jam*_*nze 6

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


Lel*_*mbo 5

声明为静态的函数对于包含文件而言是本地的。因此,您必须在与调用该函数的文件相同的文件中定义该函数。如果您想使其可从其他文件调用,则不得将其声明为静态。