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

时间:2012-05-30 08:37:08

标签: c++ static-methods

我使用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.

我已阅读着名文章"Organizing Code File in C and C++",但不明白此代码有什么问题。

7 个答案:

答案 0 :(得分:115)

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

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

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

答案 1 :(得分:21)

更改

static int GetInteger();

int GetInteger();
在这种情况下,

static会提供内部链接方法,这意味着您只能在定义它的翻译单元中使用它。

您在File.cpp中定义它并尝试在main.cpp中使用它,但是main没有它的定义,因为您声明了它static

答案 2 :(得分:6)

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

答案 3 :(得分:3)

声明为包含文件的静态arelocal的函数。因此,您必须在与调用它的人相同的文件中定义该函数。如果要使其可以从其他文件调用,则不能将其声明为静态。

答案 4 :(得分:2)

如果所有内容都在同一个翻译单元中,它应该有效。 您可能没有将File.cpp编译到与Main.cpp相同的单元中。

g++ -Wall File.cpp Main.cpp

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

extern int GetInteger();

相同
int GetInteger();

答案 5 :(得分:2)

根据我的理解,静态函数的名称会被定义它们的文件名,因此当你在main.cpp中包含file.h时,尽管你已经在文件中定义了GetInteger(),但getInteger()会被main.cpp破坏。 .cpp但由于它是静态的,它也会被破坏,并且链接器无法找到GetInteger()的定义,因为此名称不存在任何函数。

我相信所吸取的教训是不要在headerfile中声明静态函数,因为它们不是接口的一部分。

答案 6 :(得分:0)

考虑使用名称空间...

用于不需要内部成员变量的代码的逻辑部分。意味着,您的Button函数不需要引用内部常量变量。为了使函数在代码中井井有条,请考虑使用名称空间。这样可以防止函数名冲突(这可以避免您的头痛,避免可能出现的declare const Button: React.FC<ButtonProps | LinkProps | HrefProps>; <Button label="View Report" handleOnClick={console.log} />; // okay <Button label="View Report" selected />; // Property 'handleOnClick' is missing in type '{ label: string; selected: true; }' // but required in type 'ButtonProps'.(2322) <Button label="View Report" openInNewTab />; // Property 'href' is missing in type '{ label: string; openInNewTab: true; }' // but required in type 'HrefProps'.(2322) <Button label="View Report" href="/" openInNewTab />; // okay 错误)。该代码仍然可以按照您设置的方式工作,并且仍在可接受的答案范围内工作。此外,您的名称空间名称可以帮助您快速调试。

Main.cpp

Button

File.h

GetInteger()

File.cpp

LNK