我有一个带有几个 c 和 h 文件的 C 程序。我决定将程序的一部分设为“仅标头”,因此我将代码从 c 移至 h。现在我遇到了多重定义问题,但我不知道为什么。例如。:
main.c includes utils.h
vector.c includes utils.h
我将 utils.c 中的所有内容移至 utils.h(当然,还从项目中删除了 utils.c)。 utils.h 开头为
#ifndef UTILS_H_
#define UTILS_H_
// and end with:
#endif
为了确保我的防护是独一无二的,我尝试更改它(例如:UTILS718171_H_),但它不起作用。
尽管如此,编译器还是抱怨:
/tmp/ccOE6i1l.o: In function `compare_int':
ivector.c:(.text+0x0): multiple definition of `compare_int'
/tmp/ccwjCVGi.o:main.c:(.text+0x660): first defined here
/tmp/ccOE6i1l.o: In function `compare_int2':
ivector.c:(.text+0x20): multiple definition of `compare_int2'
/tmp/ccwjCVGi.o:main.c:(.text+0x6e0): first defined here
/tmp/ccOE6i1l.o: In function `matrix_alloc':
ivector.c:(.text+0x40): multiple definition of `matrix_alloc'
/tmp/ccwjCVGi.o:main.c:(.text+0x0): first defined here
...
问题可能是这样的:所有 c 文件都被编译并获得自己的代码版本,然后在链接时会导致问题,但老实说我不知道如何解决这个问题。
如果您在头文件中定义变量并将标头包含在多个 c 文件中,则必然会出现多个定义错误,因为您破坏了一种定义规则(ODR),它指出一个定义中应该只有一个定义翻译单位(头文件+源文件)。
解决方案是:
您应该只定义一次出现多个定义错误的实体。
对于函数:
在头文件中声明函数原型(您将其包含在其他源文件中)并在中定义函数唯一的一个源文件。
对于全局变量:
您在头文件(包含在其他源文件中)中声明变量 extern,然后在中定义该变量唯一的一个源文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)