未解析的符号错误

Unresolved symbol error

提问人:dcrearer 提问时间:7/3/2014 最后编辑:Deduplicatordcrearer 更新时间:7/3/2014 访问量:2832

问:

我正在使用 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);
}
C++ 头文件 extern 未解析 - 外部 编译单元

评论

2赞 πάντα ῥεῖ 7/3/2014
请正确格式化您的代码!
10赞 T.C. 7/3/2014
您从未在全局命名空间中定义过 a。 只是一个声明,而不是一个定义。的唯一定义是 中的局部变量。fooextern int foo;foomain()
0赞 dcrearer 7/3/2014
FOO 的全局定义是哪个文件重要吗?
0赞 Jonathan Leffler 7/3/2014
是的,也不是。不;您可以在任一源文件(而不是标头)中定义它,代码将链接。是的;您应该定义它,因为它是 AND 文件提供的接口的一部分。如果您有 6 个程序使用该包,则不希望每个程序都必须定义全局 .my.cppmy.hmy.cppmyfoo
0赞 dcrearer 7/3/2014
T.C.非常感谢所提供的信息非常有帮助。

答:

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
您不必初始化变量即可使其成为定义。 表示“在其他地方定义”。一个定义就是.externint foo;
1赞 Deduplicator 7/3/2014
无论如何,将非内联函数或变量的定义放入标头中是一个坏主意。
0赞 Jonathan Leffler 7/3/2014
有几种方法可以定义变量。一个是弗拉德展示的技术();另一种是省略 ,留下 ,而第三个将省略 和 初始值设定项(在文件范围内)。当然,变量定义不能在头文件中,因为如果将其放在头文件中,则每个程序只能有一个文件包含头文件,这使得头文件首先毫无意义。extern int foo = 0;externint foo = 0;externint 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 的变量”。fooint

int main(){    
    int foo = 7;
    // ...
}

这将在函数内部定义一个类型的局部变量,并将其初始化为 7。此局部变量在 之外不可见。foointmain()main()

您没有执行的操作实际上是在全局命名空间中定义。为此,请将此行添加到包含之后的 either 或 之一:foomy.cppuse.cpp

int foo;

这将在全局命名空间中定义一个名为 of type 的变量。(作为静态存储持续时间的对象,默认情况下初始化为零,但如果需要,也可以提供不同的初始值设定项。然后,链接器应该能够解析对将对象文件链接在一起时所在的全局的引用。foointfoofooprint_foo()

定义一次非常重要,但您可以根据需要多次声明它。否则,如果幸运的话,将导致链接器错误,否则会导致未定义的行为。foo