错误
本帖最后由 风眠 于 2023-10-20 19:57 编辑代码:
static/image/hrline/line7.png
func.c
#include <stdio.h>
int count;
void func(void) { printf("count = %d\n", count); }
static/image/hrline/line7.png
test3.c
void func();
int count = 520;
int main() {
func();
}
static/image/hrline/line7.png
编译结果:
$ gcc test3.c func.c&&./a.out
/usr/bin/ld: /tmp/ccMBhf9L.o:(.bss+0x0): multiple definition of `count'; /tmp/ccrIdFiW.o:(.data+0x0): first defined here
collect2: 错误:ld 返回 1
static/image/hrline/line7.png
为什么小甲鱼没报错,我却报错了呢?
附
小甲鱼没有报错是因为他将函数声明放在了test3.c文件中,而将变量定义放在了func.c文件中。这样做的话,变量count的定义只会在func.c文件中生效,而test3.c文件中只是对count进行了声明,没有进行定义。因此,在链接时不会出现变量重定义的错误。
而你的代码中,变量count的定义同时出现在了func.c和test3.c两个文件中,导致了变量重定义的错误。链接器在链接时会检查是否有多个对同一变量的定义,如果有则会报错。
要解决这个问题,你可以将变量count的定义放在一个文件中,然后在另一个文件中进行声明即可。例如,将变量定义放在func.c文件中,将变量声明放在test3.c文件中。这样就不会出现变量重定义的错误了。 这个问题是由于C语言的链接器(linker)在处理全局变量时遇到了冲突。在你的代码中,count这个全局变量在两个不同的源文件(func.c和test3.c)中都被定义了。这就导致了链接器在试图将这两个源文件链接在一起时,不知道应该使用哪个文件中的count定义,因此报错。
这个问题的解决方法是避免在多个源文件中定义同一个全局变量。你可以在一个源文件中定义count,然后在需要使用它的其他源文件中声明它。例如,你可以在func.c中定义count,然后在test3.c中声明它:
func.c:
#include <stdio.h>
int count;
void func(void) { printf(\"count = %d\
\", count); }
test3.c:
extern int count;// 声明 count,而不是定义它
void func();
int main() {
count = 520;// 使用已经在 func.c 中定义的 count
func();
}
至于你提到的“小甲鱼没报错”,我没有足够的上下文信息来解释这个现象。可能的原因是他的编译器设置或者代码与你的不同。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案 这是因为你在 test3.c 和 func.c 中都定义了同一个全局变量 count,而在 C 语言中,全局变量只能有一个定义。
在 test3.c 中,你使用 int count = 520; 定义了全局变量 count 的初始值为 520。
在 func.c 中,你使用 int count; 定义了另一个全局变量 count,并且没有给它初始值。
当你尝试将两个源文件编译链接到一起时,连接器会发现存在两个同名的全局变量 count,从而报出多次定义的错误。
小甲鱼在视频中可能通过了编译是因为他在演示的环境中,可能只编译了 test3.c 这个源文件,或者使用了其他方式来避免了多次定义的错误。
要解决这个问题,你可以做以下修改:
1. 在 test3.c 中,去掉 int count = 520; 的定义。
2. 在 test3.c 中,在 #include "func.c" 前添加 extern int count; 声明。
修改后的代码如下所示:
// func.c
#include <stdio.h>
extern int count;
void func(void) {
printf("count = %d\n", count);
}
// test3.c
#include <stdio.h>
extern int count;
void func();
int main() {
func();
return 0;
}
通过以上修改,你可以避免多次定义的错误,并且成功编译和运行代码。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页:
[1]