为什么不同C文件中的全局变量一定要extern才能可见,而函数却可以在不同c文件直接使用?

悟空又丢了 2020-09-05 04:02:34
初学者,学到extern有点混乱。
1. 全局变量不是全局可见吗,为什么还需要extern关键字?但函数却可以不需要?
2. 一个项目中的 .c 文件之间是什么关系?(有时候感觉像仅仅把一个长文件分隔成多个短文件)

...全文
1535 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mosepplin 2023-05-13
  • 打赏
  • 举报
回复

有同样的困惑,楼主有答案了吗

学码就是爱好 2020-09-27
  • 打赏
  • 举报
回复
我觉得可以这么理解,就是程序在执行时,遇到的变量或者函数,必须在使用之前是做过声明的,就是知道类型 ,这样程序在执行时才知道如何分配内存,c语言的编译应该是主函数所在的文件,所以你要保证主函数文件执行过程中除了main函数外,其他所有的函数及变量 必须都在执行前有一个声明,而include 语句 或者define 语句 会定义或包含后面用的变量和函数。
qqqccnu 2020-09-27
  • 打赏
  • 举报
回复
我也在学习的过程中有这个疑问,不使用static修饰的函数全局都可以调用吧,所以在b.c中调用a.c的fun1() 应该可以直接使用,在b.c中加入 extern fun1(),或者#include “a.h”-a.h中有extern fun1() 的声明,是为了方便代码阅读而形成的习惯吗,让代码阅读,维护起来更方便?
赵4老师 2020-09-27
  • 打赏
  • 举报
回复
《程序员的自我修养——链接、装载与库》
Intel0011 2020-09-27
  • 打赏
  • 举报
回复
另外函数的声明默认就是extern的,函数的声明加不加extern无所谓
Intel0011 2020-09-27
  • 打赏
  • 举报
回复 1
引用 楼主 CPLlearner 的回复:
初学者,学到extern有点混乱。 1. 全局变量不是全局可见吗,为什么还需要extern关键字?但函数却可以不需要? 2. 一个项目中的 .c 文件之间是什么关系?(有时候感觉像仅仅把一个长文件分隔成多个短文件)
1. 首先在标准C中是没有全局变量这个概念的,准确的说是外部变量; 如果你的整个程序中只有一个外部变量定义且没有初始化(所谓定义就是分配内存空间), 其他的都使用extern,那其他的都是声明,编译器不分配内存空间,这样就相安无事 如果你的整个程序中只有一个外部变量定义且有初始化,则其他的即使没使用extern, 那其他的也都是声明(准确的说是试探性定义),也不分配内存空间,这样也相安无事 如果你的整个程序中有一个外部变量定义且没有初始化,其他单元也有同名外部变量定义(没使用extern) 则会产生重复定义的错误 2. 一个项目中的 .c 文件都是一个模块,将项目分解为逻辑上独立的模块容易多人团队开发,项目中的各个模块相互协作完成任务。
  • 打赏
  • 举报
回复 1
1、函数是不能在各个.c文件中调用的,也需要extern声明(或者直接写函数签名,默认extern) 2、为什么需要extern?因为模块化编程需要,模块化编程导致一个工程会有若干.c文件,各个c文件都可能依赖其他c文件的变量和函数,编译器编译生成代码时经过【预处理】-【汇编】-【编译】-【链接】完成,它没有那么聪明能知道A.c调用的变量和函数是从哪里来的,需要程序员显式声明exten,这个时候前3步都能在单个.c文件中完成,到最后的链接阶段就开始查找各个调用变量和函数
赵4老师 2020-09-08
  • 打赏
  • 举报
回复
《程序员的自我修养——链接、装载与库》
均陵鼠侠 2020-09-07
  • 打赏
  • 举报
回复
具有文件作用域的标识符(即,你所说的全局变量)不需要使用存储类指定符extern,它默认就是extern的。 按照规定,如果在一个函数的声明中未使用任何存储类指定符,则被视为使用了存储类指定符extern。
自信男孩 2020-09-07
  • 打赏
  • 举报
回复
1.全局变量的生命周期是从定义到程序退出之前一直有效;不是全局可见;加extern用于标识引用外面定义的全局变量;
2. 多个源文件.c之间不一定有关系,多个具有相同功能的函数放在同一源文件里,这样便于管理和调用;
Isnis-fallen 2020-09-06
  • 打赏
  • 举报
回复
而函数却可以在不同c文件直接使用? ------- 谁说的,也要include头文件或者用extern啊
真相重于对错 2020-09-05
  • 打赏
  • 举报
回复
如果你#include 那个文件也可以不用extern,但是多个文件都#include ,他们是同名的不同变量,因此会有冲突,所以一般是用一个文件定义 ,其余用 extern 函数也一样啊,想让别的可见,也需要提前声明啊

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧