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

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

...全文
1812 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之间不一定有关系,多个具有相同功能的函数放在同一源文件里,这样便于管理和调用;
ysnis 2020-09-06
  • 打赏
  • 举报
回复
而函数却可以在不同c文件直接使用? ------- 谁说的,也要include头文件或者用extern啊
真相重于对错 2020-09-05
  • 打赏
  • 举报
回复
如果你#include 那个文件也可以不用extern,但是多个文件都#include ,他们是同名的不同变量,因此会有冲突,所以一般是用一个文件定义 ,其余用 extern 函数也一样啊,想让别的可见,也需要提前声明啊
已经博主授权,源码转载自 https://pan.quark.cn/s/6cfea8426862 内存辅助教程是一项专为初学者设计的课程,其目的是协助那些对计算机内存管理缺乏了解的学员构建起必要的基础知识。内存管理是计算机科学的一个核心概念,对于深入理解和优化程序运行表现具有决定性作用。在此教程,我们将系统性地研究内存的运行原理,探讨内存的分配与释放方法,以及借助内存辅助工具来增强程序运行效率。我们需要明确内存的定义。内存,亦称为RAM(随机存取存储器),是计算机用于临时存储数据与程序的关键组件。当CPU执行工作负载时,它必须迅速获取这些信息,而内存正是提供这种快速存取途径的设施。内存的存储容量及其传输速度直接决定了计算机处理数据的效率。在编程领域,内存管理主要包含两大方面:内存的分配与内存的释放。内存分配指的是为变量或数据结构在内存预留空间的过程,而内存释放则是将已不再被使用的内存空间归还给操作系统,以此来防止内存资源的泄漏。不当的内存管理可能引发程序运行断或性能降低的问题。本教程或许会涉及以下几个关键的学习要点:1. **内存种类**:熟悉不同种类的内存,例如栈内存、堆内存以及静态内存各自的特性。栈内存主要用于存放自动变量,其管理由编译器自动完成;堆内存则要求程序员自行进行分配和释放操作;静态内存是在程序编译阶段就已经被分配好的。2. **内存的分配与释放**:掌握运用C++的`new`与`delete`,或是C语言的`malloc`和`free`来实现动态内存的分配和释放。同时,需理解内存泄漏的概念及其可能带来的风险。3. **内存辅助工具**:介绍用于内存调试的实用工具,比如Valgrind,它能够帮助检测内存泄漏、未初始化的内存访问等异常情况,以及性...
源码链接: https://pan.quark.cn/s/3b3d90c82d79 Markdown是一种简便易用的标记语言,适用于编写文档、博客以及笔记等内容,其语法设计精简且直观,能够将普通文本转化为格式化的HTML(超文本标记语言)文档。CSDN的Markdown编辑器为用户呈现了一个友好且功能完备的写作环境,特别适合初学者进行学习。### Markdown基础语法1. **标题**:通过在文本行首加入#号来设定标题,#号的个数决定了标题的层级,最高可支持六级标题。2. **强调**:利用*或_将文本包裹起来实现斜体显示,而两个*或_则用于表示加粗效果。3. **标记**:使用==包围文本能够实现高亮显示,而~~包裹文本则用于添加删除线。4. **引用**:以>开头的行表示引用内容。5. **代码**:单个反引号`包围的文本表示内联代码,而三个反引号```则用于包裹代码块。6. **链接**:行内式链接的语法结构为\[显示文本\](链接地址),图片链接类似,但需在方括号前加上!符号。7. **列表**:通过-或*创建无序列表,而数字后跟句点可用于构建有序列表,在后面添加空格即可输入列表项内容。8. **检查列表**:- [ ] 代表未完成的任务,- [x] 代表已完成的任务。### CSDN Markdown编辑器增强功能1. **新界面设计**:提供了更为现代化且用户友好的写作界面,从而提升了整体用户体验。2. **代码高亮**:用户可以在创作心个性化设置代码高亮样式,使得代码片段更加清晰易读。3. **图片拖拽**:支持直接将本地图片拖入编辑区域,简化了图片的插入流程。4. **KaTeX数学公式**:支持LaTeX语法,方便用户撰写包含数学公式...

70,038

社区成员

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

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