在vs2019的环境下认识C++(4)

这篇主要是来讲一下链接的作用
我们在编写程序是通常会把代码写在多个文件中,这些文件编译之后对应各自的.obj文件,他们之间没有任何关系,所以需要把它们组合在一起,这就是链接阶段要干的事情
新建一个项目并写一个程序如下

#include<iostream>

void Log(const char* message)
{
	std::cout << message << std::endl;
}

int Multiply(int a, int b)
{
	Log("Multiply");
	return a * b;
}

如果我们运行此程序肯定是会报错的,因为没有main函数,即编译器缺少一个入口,我们可以查看编译器属性
在这里插入图片描述

这里看到我们可以自定义一个入口点,就是说我们确实需要一个入口点,但这个入口点不一定就叫做main函数。

接下来展示几种常见的错误
建立math.cpp,输入

#include<iostream>
void Log(const char* message);
int Multiply(int a, int b)
{
	Log("Multiply");
	return a * b;
}
int main()
{
	std::cout << Multiply(5, 8) << std::endl;
}

建立Log.cpp,输入

#include<iostream>
void Logr(const char* message)
{
	std::cout << message << std::endl;
}

如果我们生成该项目,我们会得到错误报告,因为Log函数被声明了,但是编译器找不到它的主体(body)。这个问题我们前面已经探讨过,这里不再赘述。但是如果我们将Log("Multiply");注释掉,这个错误就会消失,因为我们根本就没有调用Log函数。
此外,我们还可以将std::cout << Multiply(5, 8) << std::endl;注释掉,我们不调用Multiply,就不会调用Log,也就不会报错。但结果并不如我们想象的那样
在这里插入图片描述
因为编译器认为Multiply这个函数虽然在这个文件中没有被调用,但它仍可能在其他地方被使用,因此即便注释掉也会认为进行了调用,当然我们可以用一些办法来消除这个错误,比如更改函数定义语句

int Multiply(int a, int b)

变为

int static Multiply(int a, int b)

这样我们就可以运行这个程序了,因为我们向编译器“告知”Multiply这个函数仅仅会在math.cpp文件内被调用。

另外一种情况是我们可能会定义两个名字相同的函数,这样Linker在工作时,就不知道要链接哪一个函数,我们可能会觉得这种错误非常低级因为我们肯定不会定义两个相同名字的函数。但往往并不是这样的。
我们在math.cpp中写入

#include<iostream>
#include"log.h"
void Log(const char* message);
int static Multiply(int a, int b)
{
	Log("Multiply");
	return a * b;
}
int main()
{
	std::cout << Multiply(5, 8) << std::endl;
}

在Log.cpp中写入

#include<iostream>
#include"log.h"

void InitLog()
{
	Log("Initialized Log");
}

在Log.h中写入

#pragma once
void Log(const char* message)
{
	std::cout << message << std::endl;
}

如果我们运行该项目,就会得到报错
在这里插入图片描述
可以看到在LINK过程中得到了错误,提示我们log函数已经在Log.obj中定义过了。虽然我们只在函数中定义了一次Log,但是我们在两个.cpp文件中都include了Log.h,也就是在两个文件中都进行了定义,这就引发了重复定义。
当然这种情况也可以被避免,我们在头文件中定义Log函数时,改为

void static Log(const char* message)

表示我们仅仅会这个函数在include时只会在此文件有效,两个.cpp文件都有单独属于自己的Log函数。再次运行该程序就不会报错了。
当然我们还可以将定义改为

inline void Log(const char* message)

注:内联函数涉及到更深层次的知识点

发布了7 篇原创文章 · 获赞 0 · 访问量 117
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览