我一直在测试全局变量、定义和声明,现在停在这个情况:
main.c:
#include "stdio.h"
void func(void);
int a;
int main(void) {
a = 20;
printf("in main: %d\n", a);
func();
return 0;
}
add.c:
#include <stdio.h>
void func(void);
int a;
void func() {
printf("in add: %d\n", a);
}
所以在C语言中,这行代码是
int a;
声明
和定义
都是指变量,但我们知道一个变量不能被定义多次。那么如果我们有两个定义和两个声明的a
,为什么这段代码还能编译通过呢?我正在使用CLion,当我在main
中按下“转到定义/声明”按钮时,它会将指针移动到add.c
中的a
,当我在add.c
中执行相同操作时,它会返回到main.c
,所以我无法理解这里发生了什么。
void func(void);
е’Ңextern int a;
зҡ„add.h
ж–Ү件гҖӮ然еҗҺеңЁдҪ зҡ„main.c
дёӯеҠ е…Ҙ#include "add.h"
гҖӮе…ЁеұҖеҸҳйҮҸжҳҜдёҚеҘҪзҡ„гҖӮ - undefinedint a;
时,它是一个“常见”的符号。请参考我的回答:https://stackoverflow.com/questions/64626917/global-variables-and-the-data-section/64627070#64627070 以获取解释。 - undefinedmain.c
和add.c
文件一起编译,编译命令为gcc -Wall -Wextra -g -c
,然后使用gcc main.o add.o -o yourprog
进行链接。最后,使用GDB调试器对yourprog
可执行文件进行调试。请务必阅读您所使用的编译器和调试器的文档。 - undefineda
的定义而变得未定义,并不意味着你可以依赖编译器拒绝该程序或者诊断出问题。"未定义"就是"未定义"。 - undefined