提问人:dcrearer 提问时间:7/3/2014 最后编辑:Deduplicatordcrearer 更新时间:7/3/2014 访问量:2832
未解析的符号错误
Unresolved symbol error
问:
我正在使用 Visual Studio 2012 进行编程原理和实践中的练习。尝试编译下面的源代码时,我收到链接器错误:
未解析的符号 int foo。
我不明白为什么符号未解析。
my.h
extern int foo;
void print_foo();
void print(int);
我的.cpp
#include "my.h"
#include "../../std_lib_facilities.h"
void print_foo()
{
cout<<foo<<'\n';
}
void print(int i)
{
cout<<i<<'\n';
}
使用.cpp
#include "my.h"
int main(){
int foo = 7;
print_foo();
print(99);
}
答:
2赞
Vlad from Moscow
7/3/2014
#1
本声明
extern int foo;
是名称 foo 的声明。这不是 foo 的定义。
您必须初始化此变量,它才能成为定义。例如
extern int foo = 0;
虽然我在你的代码中看不出有什么意义。
也许你的意思是以下。我假设模块中定义的变量,因为如果只有一个模块,我看不到使用标头的意义。
/* my.cpp */
#include "../../std_lib_facilities.h"
extern int foo = 0;
void print_foo();
void print(int);
void print_foo()
{
cout<<foo<<'\n';
}
void print(int i)
{
cout<<i<<'\n';
}
int main(){
extern int foo;
foo = 7;
//...
如果要使用标头,则代码可能如下所示
/* my.h */
extern int foo;
void print_foo();
void print(int);
/* my.cpp */
#include "my.h"
#include "../../std_lib_facilities.h"
int foo;
void print_foo()
{
cout<<foo<<'\n';
}
void print(int i)
{
cout<<i<<'\n';
}
/* use.cpp */
#include "my.h"
int main(){
extern int foo;
foo = 7;
print_foo();
print(99);
}
评论
2赞
nullptr
7/3/2014
您不必初始化变量即可使其成为定义。 表示“在其他地方定义”。一个定义就是.extern
int foo;
1赞
Deduplicator
7/3/2014
无论如何,将非内联函数或变量的定义放入标头中是一个坏主意。
0赞
Jonathan Leffler
7/3/2014
有几种方法可以定义变量。一个是弗拉德展示的技术();另一种是省略 ,留下 ,而第三个将省略 和 初始值设定项(在文件范围内)。当然,变量定义不能在头文件中,因为如果将其放在头文件中,则每个程序只能有一个文件包含头文件,这使得头文件首先毫无意义。extern int foo = 0;
extern
int foo = 0;
extern
int foo;
0赞
Vlad from Moscow
7/3/2014
@Inspired 你说得很傻。链接器发出变量未定义的错误。所以你必须定义它。
0赞
Dakorn
7/3/2014
extern int foo;
在 my.h' 中是不必要的,提供了有关全局变量的信息。main()'. Header file
foo
5赞
T.C.
7/3/2014
#2
extern int foo;
这是一项声明。它告诉编译器“在某处定义的全局命名空间中将有一个称为 of type 的变量”。foo
int
int main(){
int foo = 7;
// ...
}
这将在函数内部定义一个类型的局部变量,并将其初始化为 7。此局部变量在 之外不可见。foo
int
main()
main()
您没有执行的操作实际上是在全局命名空间中定义。为此,请将此行添加到包含之后的 either 或 之一:foo
my.cpp
use.cpp
int foo;
这将在全局命名空间中定义一个名为 of type 的变量。(作为静态存储持续时间的对象,默认情况下初始化为零,但如果需要,也可以提供不同的初始值设定项。然后,链接器应该能够解析对将对象文件链接在一起时所在的全局的引用。foo
int
foo
foo
print_foo()
只定义一次非常重要,但您可以根据需要多次声明它。否则,如果幸运的话,将导致链接器错误,否则会导致未定义的行为。foo
评论
foo
extern int foo;
foo
main()
my.cpp
my.h
my.cpp
my
foo