重复定义的解决方法(头文件与源文件为什么要分开的解释)

本文详细解释了在C++项目中头文件(.h)与源文件(.cpp)分开使用的原因,以及如何通过extern关键字解决因重复定义导致的编译错误。条件编译在单个编译单元内有效,但在多个源文件链接时不起作用,从而引发重复定义问题。解决方案是在头文件中使用extern声明变量,而在源文件中进行实际定义,确保每个变量只定义一次。
摘要由CSDN通过智能技术生成

在项目开发中,头文件与源文件分开的具体理解:

例如下面一段程序:
// head1.h中
#ifndef _HEAD1_H
#define _HEAD1_H
int x;
#endif
// head1.cpp中
#include "head1.h"
// main.cpp中
#include "head1.h"

int main() {
    x = 1;
    return 0;
}

如果命令行输入 : g++ -c *.cpp

会出现 multiple definition of `x’

即重定义, 这是为什么呢,不是已经有条件编译了吗,为什么还会出错呢

首先我们要理解C语言源程序的执行过程 : 预处理 --> 编译 --> 链接 --> 生成可执行文件

首先,条件编译可以解决一次编译过程中出现重复定义的情况,什么是一次编译过程呢,就是说如果main函数包含了多个头文件 “head1.h”, “head2.h” 而 "head2.h"中也导入了 “head1.h”, 如果没有条件编译就会定义两次head1.h中的内容,所以在执行 g++ main.cpp 是不会出现任何错误的

而上面的情况是多了一个 head1.cpp 的源文件,我们要想得到可执行文件首先需要编译每一个文件得到链接文件(.o),然后再链接所以的链接文件 g++ *.o ,这里其实已经可以看出问题了,也就是说编译是分开编译的,有多少个源文件就编译几次,条件编译在两个源文件之间是没有起到作用的,所以链接的时候每个文件都定义了所以的函数和变量,自然就重复定义了。

所以 声明 和 定义 分开就是为了解决上面的问题,声明可以声明很多次,在编译过程中其他文件包含了某个头文件,也只是一直在重复编译某个变量或函数,定义却只是在编译源文件时产生,这样也就不会出现重复定义的情况。

然后给大家一个可能很不熟悉的关键字(我就是不知道这个才写这篇文章的),
c中可以用 extern 来声明变量, 即 extern char a[10][20].

上面的代码解决方法就是把头文件改成这样:

// head1.h 中
// head1.h中
#ifndef _HEAD1_H
#define _HEAD1_H
extern int x;
#endif

然后源文件改成:

// head1.cpp中
#include "head1.h"
int x = 10;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值