只要你看过我系列中之前关于编译和链接的内容,你就能看懂以下内容,直接上例子:
Static.cpp
int S_var = 5;
main.cpp
#include <iostream>int S_var = 10;int main()
{std::cout << S_var << std::endl;std::cin.get();
}
这样Build是会报错的“fatal error LNK1169: one or more multiply defined symbols found”,因为链接器在多个地方发现了S_var的定义,从而发生了冲突。如果我们修改一下Static.cpp:
static int S_var = 5;
这样就会输出10。
所以static
关键字就是把定义限制在它自己所在的文件中,这样在链接的时候别的文件就不会链接到这个定义,避免产生冲突。
那如果我们希望在main.cpp中使用static.cpp的S_var呢?这时可以使用extern
:
Static.cpp
int S_var = 5;
main.cpp
#include <iostream>extern int S_var;int main()
{std::cout << S_var << std::endl;std::cin.get();
}
此时就会输出5。那如果这样呢?
Static.cpp
static int S_var = 5;
main.cpp
#include <iostream>extern int S_var;int main()
{std::cout << S_var << std::endl;std::cin.get();
}
自然会报错,因为main.cpp希望链接一个外部的S_var,但是Static.cpp中的S_var是不会被其他文件找到的,所以报错“fatal error LNK1120: 1 unresolved externals”。