在.h和.c文件中定义功能

大卫542

我有以下程序设置:

// 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};

错误:重新定义了“修剪”

dbush

当您在头文件中定义函数时,每个包含该函数的源文件都将具有该函数的定义。对于您编译的每个源文件,它都会创建一个包含函数定义的目标文件。然后,当您将这些源文件链接在一起以创建可执行文件时,您会对该函数有多个定义,从而导致错误。

在您的示例中,您是在一步中进行编译和链接的,但是每个源文件的目标文件在链接之前仍会创建为临时文件。

通过将trimin的str.c定义放在一个文件,您就只能对其有一个定义,而标头具有一个声明,其他模块可以使用声明来知道如何调用该函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章