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错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值