C++

C++头文件中函数被多次定义

头文件多次被include

Posted by bbkgl on October 9, 2019

疏影横斜水清浅

暗香浮动月黄昏

重定义问题:

Hd8ec6d86439b42128ff781f104bf58bdv

之前由碰到过类似的问题,然后可以通过条件编译来解决:

#ifndef XXXX
#define XXXX
...
...
    
#endif

大概就是头文件被多个源文件包含以后,里面的函数也会被多次编译生成可执行文件,就发生了重定义的问题。通过条件编译,可以解决一种情况下的问题,那就是头文件中只声明,而不定义或者说不实现。

发生这个问题的本质原因是,当头文件函数被多次编译后,该函数被调用时,编译器不知道该调用哪个函数了,也就是存在二义性问题。

那如何解决呢?

答案是:内联函数。

这里要思考,我们为什么会把一些函数的声明和定义都放到头文件里?

因为这些函数很简单,类似于一种工具,可能会被经常调用。。。

内联函数正是为了这种作用出现的。

为什么内联函数可以解决这个问题呢?

因为内联函数和宏定义类似,在调用点被展开的,也就是相当于手动复制了一份代码在调用点。

多个地方执行同一份代码会产生重定义问题吗?显然不会。