未解决的符号错误

dcr*_*rer 0 c++ header-files unresolved-external extern compilationunit

我正在使用Visual Studio 2012进行编程原理和实践练习.当尝试编译下面的源代码时,我收到链接器错误:

未解决的符号int foo.

我不明白为什么这个符号没有得到解决.

my.h

extern int foo;
void print_foo();
void print(int);
Run Code Online (Sandbox Code Playgroud)

my.cpp

#include "my.h"
#include "../../std_lib_facilities.h"

void print_foo()
{
    cout<<foo<<'\n';
}

void print(int i)
{
    cout<<i<<'\n';
}
Run Code Online (Sandbox Code Playgroud)

use.cpp

#include "my.h"

int main(){
    int foo = 7;

    print_foo();
    print(99);
}
Run Code Online (Sandbox Code Playgroud)

T.C*_*.C. 5

extern int foo;
Run Code Online (Sandbox Code Playgroud)

这是一个声明.它告诉编译器" 在某处定义的全局命名空间中将会有一个名为footype 的变量int".

int main(){    
    int foo = 7;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

你没做的事实上是在全局命名空间中定义 foo.要做到这一点,请将此行添加到其中一个my.cpp或者use.cpp包含之后:

int foo;
Run Code Online (Sandbox Code Playgroud)

这定义了全局命名空间中名为footype 的变量int.(静态存储持续时间的对象,foo默认情况下初始化为零,但你也可以提供一个不同的初始化,如果你想要的.)然后链接器应该能够参考解决全球foo这是在print_foo()当你链接的目标文件一起.

定义 foo一次是非常重要的,尽管你可以根据需要多次声明它.否则违反一个定义规则会导致链接器错误(如果幸运的话),如果不是,则会导致未定义的行为.