在多文件的项目中,我们可以发现有时会出现multiple definition of ‘xxx‘的问题。这个问题一般有以下表现和处理。

原因
(1)变量或者函数在某一个头文件中定义(不是声明),而这个头文件被多个源文件包含,导致其中的变量或者函数多次编译;
(2)在项目中,对于依赖的源文件夹中的所有.c文件都会被编译,如果其中一个.c文件被另外一个.c文件include,就像下面的代码一样,那么就会导致被包含的那个.c文件中定义的变量和函数被两次编译,从而导致重复定义。

解决方法
(1)针对原因1,只在源文件中定义函数或者变量,而在头文件中使用extern关键字对其进行声明,且为了保证头文件只被编译一次,使用条件编译:#ifndef+#define+#endif,具体如下:

#ifndef __TEST_COMMON_H__
#define __TEST_COMMON_H__
    extern int test;
#endif

(2)针对原因2,详查每个.c文件的包含关系。尽量不要使用.c文件包含.c文件,而使用头文件声明的方式调用另一个.c文件中的函数或者变量,否则容易忘记,导致重复定义。

为了防止上述问题的出现,我们可以把需要用在多个源文件中的变量或函数集合到一个统一的文件中,然后在头文件中进行声明,在其他地方都用包含头文件的方式进行处理。

12-30 12:44