我使用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++",但不明白此代码有什么问题。
答案 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