我已经将我的C源代码拆分成两个文件:分别是main.csecondary.c.

/* main.c */

#include <stdlib.h>
//#include "secondary.c"

int main ()
{
         extern int my_var;

         my_var = 123;
         print_value ();
         exit (0);
}
/* secondary.c */

#include <stdio.h>
int my_var;

void print_value ()
{
        printf("my_var = %d\n", my_var);
}

我使用以下命令来编译它们:

$gcc -Wall main.c secondary.c

但在这种情况下,我收到以下警告:

snowgold@iskhakov-r:~/clang$ gcc -Wall main.c secondary.c
main.c: In function ‘main’:
main.c:9:9: warning: implicit declaration of function ‘print_value’ [-Wimplicit-function-declaration]
    9 |         print_value();
      |         ^~~~~~~~~~~

然后我决定在main.c中加入secondary.c.为此,我在main.c中键入#include "secondary.c".

在本例中,我得到以下错误:

snowgold@iskhakov-r:~/clang$ gcc -Wall main.c secondary.c
/usr/bin/ld: /tmp/ccKKRtFc.o:(.bss+0x0): multiple definition of `my_var'; /tmp/ccx4HrNG.o:(.bss+0x0): first defined here/usr/bin/ld: /tmp/ccKKRtFc.o: in function `print_value':
secondary.c:(.text+0x0): multiple definition of `print_value'; /tmp/ccx4HrNG.o:main.c:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status

我该怎么做才能摆脱-Wimplicit-function-declaration人呢?

推荐答案

根据第一编译器消息,编译器在编译模块时不知道模块main.c中使用的函数print_value()是如何声明的.

#include <stdlib.h>
//#include "secondary.c"

int main ()
{
         extern int my_var;

         my_var = 123;
         print_value ();
         exit (0);
}

使用函数声明(原型)创建一个头文件,如下所示

void print_value( void );

并将头部包括在两个模块中.

对于第二条消息,在main.c中包含secondary.c之后,在模块main.csecondary.c中都有相同函数的两个定义.不要在彼此之间包含c字形.

请注意,根据C标准,不带参数的函数main应声明为

int main( void )

也是这句话

exit (0);

是多余的.把它拿掉.

还请记住,根据C23标准,您不能使用没有函数原型的函数,因为它在C23标准之前是允许的.

C++相关问答推荐

获取二维数组的最大元素

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

getchar读css + z还是返回css?

无效指针值在函数调用之间莫名其妙地改变

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

Linux不想运行编译后的文件

预先分配虚拟地址空间的区域

Flose()在Docker容器中抛出段错误

对重叠字符串使用MemMove

CGO:如何防止在使用CGO在包中包含C头文件时出现多个定义...&q;错误?

FRIDA-服务器成为端口扫描的目标?

如何在C中使数组变量的值为常量?

链表删除 node 错误

合并对 struct 数组进行排序

Valgrind正在使用一个Fexecve电话报告不可能发生的事情

当读取可能会阻塞管道中的父进程时,为什么要等待子进程?

共享内存未授予父进程权限

free后内存泄漏?

`void foo(int a[static 0]);` 有效吗?

段错误try 访问静态字符串,但仅有时取决于构建环境