我有以下程序设置:
// main.c
#include "str.h"
...
trim("Hello");
// str.h
char* trim(char* str) {
return str;
}
// str.c
#include "str.h"
[empty]
并编译为:$ gcc main.c str.c -o run && ./run
,并且出现以下错误:
/tmp/ccEUb8mH.o: In function `trim':
str.c:(.text+0x0): multiple definition of `trim'
/tmp/ccCiyN5A.o:main.c:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
但是,一旦我更改str.h/c
为以下偏斜/定义,它就会起作用:
// str.h
[empty]
// str.c
#include "str.h"
char* trim(char* str) {
return str;
}
第二个版本可以运行但第一个版本不能运行的原因是什么?
我想这与下面的方法可以正常工作有关:
char * trim(char * str);
char * trim(char * str);
char * trim(char * str);
char * trim(char * str);
char * trim(char * str);
但是有了定义,它就不会:
char * trim(char * str){return str};
char * trim(char * str){return str};
错误:重新定义了“修剪”
当您在头文件中定义函数时,每个包含该函数的源文件都将具有该函数的定义。对于您编译的每个源文件,它都会创建一个包含函数定义的目标文件。然后,当您将这些源文件链接在一起以创建可执行文件时,您会对该函数有多个定义,从而导致错误。
在您的示例中,您是在一步中进行编译和链接的,但是每个源文件的目标文件在链接之前仍会创建为临时文件。
通过将trim
in的str.c
定义放在一个文件中,您就只能对其有一个定义,而标头具有一个声明,其他模块可以使用该声明来知道如何调用该函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句