当前位置: 首页 > news >正文

C语言定义与声明区别:一图看懂分配空间的关键

想要弄明白这两者,实际上并没有太大的困难存在。然而,至少超过半数的C书未能将其区分清晰。存在一些书在某一个章节之中把这个问题阐释明白了,但是在其他的章节里面却胡乱表述一通。实在是让人感到无奈呀。

这两者都是对实体Object的操作。

在针对任何一个实体的情况之下,Definition必然得存在一次,而且仅仅只能存在一次。Declaration存在的次数既能够是0次,又能够是任意的次数。

Definition是实实在在产生实体的行为,就是专为该实体来分配用于存储的空间。Declaration不会造就实体,实际上,被Declaration的那个实体必定是已然存在着的。

比如说,在源文件A当中,定义了一个外部的整数数组,这个外部的意思是,它是在任一函数的外面的 ,是这样的情况。

int iArray;

编译器为其分配了空间,譬如400Bytes。

要是你期望在另外一个称作源文件B的里面也能够去访问这个数组,那你就一定得在文件B开始的部分对它进行外部声明。

extern int iArray;

这是出自《C专家编程》当中所给出的例子,这个例子举得相当不错,你或许可能已经留意到声明里面少了100,书里面讲了,因为并没有在声明之时为数组分配内存,所以并不需要去提供有关数组长度的信息,这样的一种说法很容易引发误解,或者能够换一种说法,这里并没有生成数组iArray,仅仅只是声明它,它已经在另外一个源文件里面定义了,这里只不过是声明它是外部的,所以不需要也不能够声明它的元素数。

此问题着实太过简便了。你仅需牢记这般内容即可:针对每一个实体而言,所给定的定义数务必得是1才行,而声明数则应当是从0到N之间的任意一个数。要是你的程序代码并非恰巧如此对应,那么便会出现Bugs。要么会出现错误致使程序无法正常运行,要么所获取到的结果并非是你预先所期望得到的那般结果。

从结构化角度去看,我觉得,extern声明所干的事儿,不过就是使得那个数组从文件A所具有的作用域进行了扩展,扩展向了文件B罢了。

还有一种声明,这种声明更为常见,它是结构、联合等的声明。这种声明与上述的不一样。许多书里说的是结构、联合的定义,而我所说的是声明。这仍然是C专家编程里的例子。

定义一个结构体,结构体名为veg,结构体里有两个成员,一个是整型的weight,另一个是整型的price_per_lb。

定义结构体类型为veg,其中包含洋葱、萝卜、芜菁。

第一句,声明了一个结构类型,它名为veg,里面包含两个成员,这两个成员的类型都是int型。第二句,定义了三个结构变量,这三个结构变量的类型都是veg类型。

我讲的是声明,依照上面所讲的那种说法,是不会去分配空间。在这儿,要是这么来讲,恐怕是会存在那么一点儿问题的。不进行空间分配,换句话讲,就是第一个语句不会编译产出任何代码。针对上面的那两个语句,像这样去说还能够解释得通。然而,要是我在声明了结构类型之后,打算动态而非静态地生成结构变量,那么在运行时要怎么依据这根本不存在的东西去生成实体?

我未曾看过带结构类型声明的源代码经编译之后的目的码,不清楚其中是否存在和结构类型声明有关的代码。我进行推测,这段代码必定是存在的。只不过它并非被用于运行的,而是被用于复制的。你能够将它称作模板,是用来生成实体的那种模板。运行代码与模板代码或许放置于不一样的地方。

这只是个猜想罢了。有过几回。将此猜想写在了BBS上。很遗憾。无人提出反对。鉴于无人反对。所以就没办法获得验证。

可以把结构类型的声明和结构变量的定义写在一起:

定义结构体类型 veg,其中包含整型成员 weight 和每磅价格 price_per_lb,声明 onion、radish、turnip 为该结构体类型的变量。

于这般格式之内,类型veg能够被省略掉。然而不将其省略所具备的益处是,你能够在随后再依据veg去定义第四、第五个结构变量。

在《C专家编程》之中提到的内容相当不错,关于结构类型的声明,以及结构变量的定义,将它们分开来写会比较好。

这篇文章,最初是于2006年6月6日,发表在了CSDN之上,署名乃是beepbug。在此处,进行了一些修改。

原文链接:

https://blog.csdn.net/beepbug/article/details/776063

这篇内容对C++同样适用,在C++当中,只能讲“声明一个类”,而不能讲“定义一个类”,类并非实体,当代码装入内存之际,操作系统不会为其分配空间,以某类作为样板能够生成若干个对象,这才是定义,在代码装入内存之时,操作系统会为对象分配空间。

http://www.jsqmd.com/news/541687/

相关文章:

  • 利用快马ai快速构建java八股文交互式学习原型,直观掌握核心概念
  • 2串双节锂电池充电管理芯片PW4253,DEMO板各项测试
  • 提升开发效率:用快马为你的项目自动注入这些实用糖点
  • 【深度学习新浪潮】摩尔定律对科技发展有什么核心影响?
  • 番茄小说下载器:一站式离线阅读解决方案终极指南 [特殊字符]
  • 前端图片优化:别再让你的图片拖慢应用了
  • AI驱动的自动化测试:框架选型避坑指南(2026专业版)
  • 智能爬虫方案:OpenClaw+Qwen3-32B镜像理解网页结构精准采集
  • leetcode 1508. Range Sum of Sorted Subarray Sums 子数组和排序后的区间和
  • AI赋能开发:让快马平台智能解析并生成17.100.c.cm规格的优化代码
  • OpenClaw语音控制:nanobot对接Whisper实现声控自动化
  • 5分钟掌握OneMore:为OneNote文档添加智能大纲编号的完整指南
  • 利用快马平台ai快速生成stm32cubemx风格初始化代码原型
  • Windows 内网 Web 服务穿透方案推荐
  • 《B4410 [GESP202509 一级] 金字塔》
  • 终极突破:如何用LeRobot框架7天构建智能协作机器人系统
  • MycilaTrafficLight:嵌入式交通灯双模驱动库
  • 工作窗口紧急管理:如何用Boss-Key实现毫秒级隐私保护
  • 前端未来趋势:别再用老掉牙的技术了
  • Cuvil Python插件安装全故障树分析(含pip install失败/clang版本冲突/Apple Silicon签名拒绝等11类报错速查表)
  • 无代码自动化:OpenClaw+nanobot让非技术人员也能玩转AI
  • 手把手解析Linux6.1内核中的maple_tree:从find_vma看数据结构实战
  • rBase64:嵌入式系统零堆分配BASE64编解码库
  • 在线编译器与汇编分析实战指南:从代码到机器指令的深度探索
  • 探索SPH - FEM泥石流模拟冲击拦挡坝:视频教程深度解析
  • 效率提升50%:OpenClaw+GLM-4.7-Flash自动化办公全场景实测
  • MySQL之优化SELECT语句:从索引到SQL改写的全链路实战指南
  • Ubuntu 22.04 LTS下,解决正点原子I.MX6ULL开发板U-Boot NFS下载卡在TTTTTT的保姆级教程
  • [FFXIVChnTextPatch]:国际服中文补丁解决方案——从入门到精通
  • Flutter + OpenHarmony应用上架华为应用市场实战:从代码合规到审核加速的进阶策略