C语言的全局变量到底是何规则,这里做个整理
首先是普通用法, 追加三个文件, main.c, file1.c, file1.h
file1.c
#include "file1.h"
// 这里定义一个全局变量有初值
int gint = 333444;
file1.h
// 这是申明是外部的
extern int gint;
main.c 这里
#include <stdio.h>
// 包含 file1.h
#include "file1.h"
// 全局变量验证
int main() {
// 使用全局变量
printf("%d", gint);
return 0;
}
编译运行
成功了,main里没有定义gint,但是可以用。
这就是最基本的使用方式,想要某全局变量就调用相应的.h文件
修改main.c ,重复定义 extern int gint
#include <stdio.h>
#include "file1.h"
// 在这里重复定义一个
extern int gint;
// 全局变量验证
int main() {
printf("%d", gint);
return 0;
}
编译执行
没问题,重复定义相同extern int gint;是可以的。也就是说extern只是一个申明不是代码。
删除#include “file1.h”
#include <stdio.h>
extern int gint;
// 全局变量验证
int main() {
printf("%d", gint);
return 0;
}
看来只需要main.c 和 file1.c 就可以了, .h 只是一个申明作用
删除main.c 的 “extern” 描述符
#include <stdio.h>
// 删除extern
int gint;
// 全局变量验证
int main() {
printf("%d", gint);
return 0;
}
编译
报了重复定义错误, 看来全局变量只可以定义一次的
看看函数的情况, 追加 test() 函数
main.c
#include <stdio.h>
extern int gint;
// 追加一个test()申明
void test();
// 全局变量验证
int main() {
printf("%d", gint);
return 0;
}
file.c
#include "file1.h"
#include "stdio.h"
int gint = 333444;
// 定义一个test, 函数定义都是全局的
void test() {
printf("hello");
test();
}
编译下试试
没问题, 函数不需要extern申明, 只需要void test();
如果函数也写成extern申明
#include <stdio.h>
extern int gint;
extern void test();
// 全局变量验证
int main() {
printf("%d", gint);
test();
return 0;
}
没问题, 看来函数申明是隐式的extern
删掉void test(); 申明 试试
mian.c
#include <stdio.h>
extern int gint;
// 全局变量验证
int main() {
printf("%d", gint);
test();
return 0;
}
编译下
编译有告警, 运行倒是没问题.
删除extern int gint;定义是否也可以删呢
main.c
#include <stdio.h>
// 全局变量验证
int main() {
printf("%d", gint);
test();
return 0;
}
不行了, 找不到变量定义. 变量和函数不一样, 函数找不到时编译器会自动申明, 然后告警, 变量则不会生成,只会报错.这主要看编译器的脾气了
试试变量定义全用extern
file.c
#include "file1.h"
#include "stdio.h"
//用extern
extern int gint = 333444;
void test() {
printf("hello");
}
main.c
#include <stdio.h>
// 也用extern
extern int gint;
extern void test();
// 全局变量验证
int main() {
printf("%d", gint);
test();
return 0;
}
没想到也是可以的,运行没问题,就是有告警.
函数多次申明
file1.c
#include "file1.h"
#include "stdio.h"
// 自己这里也申明
void test();
int gint = 333444;
void test() {
printf("hello");
}
mian.c
#include <stdio.h>
extern int gint;
extern void test();
// 全局变量验证
int main() {
printf("%d", gint);
test();
return 0;
}
没问题,函数可以多次申明的
看起来就是就是这样了
1, 变量使用外部定义的要用 extern
2, 变量没有 extern 不可重复申明
3, 函数可以重复申明, 甚至不申明, 没有找到会自动申明
4, 函数也可以加 extern 申明
5, 变量全部用 extern 申明也是可以运行的, 估计会自动定义变量