C++错题本--duplicatesymbol问题

曹小满 2024-11-11 21:47:24

顾名思义, duplicate symbol是重复符号的意思!

代码是用来做什么的(问题缘由 & 代码结构)

写排序算法, 提出了一个公共的头文件用来写一些工具方法, 比如打印数组内容. 以便于不同文件代码需要打印数组内容的时候,直接引入相关头文件即可, 但是编译时出现了 duplicate symbol 报错.

总共涉及四个文件

InsertSort.h, InsertSort.cpp : 插入排序算法实现部分

CollectionUtil.h : 数组集合相关工具方法, 如打印数组

main.cpp : 输入待排序数组,以及调用排序算法

代码如下

CollectionUtil.h : 数组集合相关工具方法, 如打印数组

InsertSort.h, InsertSort.cpp : 插入排序算法实现部分

InsertSort.h

nsertSort.cpp

main.cpp : 输入待排序数组,以及调用排序算法

编译时出现问题,报错如图所示:

将ClollectionUtil.h 写一个专门的cpp实现, 里面含有对printArray 全局函数的定义.即可

如改为:

原因:

C++中, 多文件编译, 整个横向的跨度上, 对于函数而言,允许多次声明, 一次定义.  但是不允许多次声明, 多次定义. 代码原来的写法,正是促成了 "多次声明多次定义"的情况, 是不符合其标准的.

我们需要重新审视一下, #include 在预编译的时候到底做了什么, 过往仅仅是一个单独文件的编译, 我们知道就是把被引入的内容代码进行了全拷贝. 但是为什么编译多个文件的时候, 上述代码多个文件引入了相同的头文件, 头文件里明明做好了 #ifndef #define #undef 之类的保护, 就拷贝那么一次, 为什么还是冲突了呢? 原因在于C++编译器,对于文件的编译, 是分开编译的. 虽然说定义一个全局的宏, 是全局可见, 但是编译时由于分开编译, 会导致如图所示:

根据图示, 预处理的时候, 尽管存在ifndef define等宏定义, 但是最终出来的结果是, 全局存在两处 printArray 函数的定义. 不符合标准. 解决办法就是, 把头文件中内容改为只声明printArray()函数, 而不让其有定义, 定义写在cpp文件中, 这样尽管全局会出现多次声明, 但依然符合标准.

总结及扩展

C++允许多次声明, 一次定义. 定义指的是,写出具体实现逻辑的方法.

C++编译的时候会分开编译.

C++头文件,最好不要带函数的定义。

0 阅读:1

曹小满

简介:音视频修炼之路