c/c++编译过程的链接Link问题与关键字static,extern

以下面代码为例说明:

#include <iostream>
void Never(const char* message);
int Multiply(int a, int b) {
	Never("Multiply");
	return  a * b;
}

int main() {
	//std::cout << Multiply(5, 8) << std::endl;
	std::cin.get();//暂停vs控制台作用(getchar())
	return 0;
}

可以运行测试看出这段代码是过不了编译的,原因是因为Never函数只有声明,没有定义,但是又在Multiply函数中被调用了(简而言之就是never有问题从而导致Multiply有问题)。在vs中表面上并没有爆红线(但是有条小绿线),下面谈谈具体原因。在这里插入图片描述
可以看到,主函数main里面其实并没有调用Multiply函数,为何编译器还不让通过呢,其实准确来说是编译过程的链接(Link)步骤不让通过。虽然这个cpp文件的主函数没用到Multiply函数,但是Link还是会检测我们代码中所写的函数是不是有问题。(万一我们下一次在别的cpp文件就用Mutiply函数呢)

但是嘛,我们这次就是没用Multiply函数,还是有办法通过编译的链接过程。既然链接的作用是检查这个函数是否正确以供可以随时被使用,而此cpp文件下实际并没有使用到,我们可以加上static关键字,就可以通过编译了。在这里插入图片描述
static修饰的函数:static静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

而这一点也刚好和链接Link对应起来了,static声明此函数不被别的文件使用,所以就不存在link过程了,所以自然通过编译了。


补充:在一个cpp定义在这里插入图片描述

在另一个主函数cpp定义
在这里插入图片描述
会出现error LNK1169: 找到一个或多个多重定义的符号,同样的道理,如果把在第一个cpp文件的int a = 10;改为static int a =10;或者把第二个文件的int a =5;改为extern int a(extern表示尝试寻找链接外部文件的当前变量);就可以通过编译了,原因还是因为static修饰的表示当前文件可见,不能被其它文件使用,所以这样不会产生Link错误。

发布了17 篇原创文章 · 获赞 15 · 访问量 1868

猜你喜欢

转载自blog.csdn.net/weixin_43723614/article/details/104901618