c语言的全局变量规则验证

本文探讨了C语言中全局变量的声明和使用,强调了extern关键字的作用。全局变量只能定义一次,但可以在多个文件中通过extern声明来使用。函数的声明可以重复,甚至不声明也能由编译器自动生成,而全局变量没有extern时会导致重复定义错误。实验显示,所有全局变量使用extern声明也是可行的,尽管会有警告。
摘要由CSDN通过智能技术生成

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 申明也是可以运行的, 估计会自动定义变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Potcutre

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值