news 2026/4/15 3:20:12

C语言释疑3:声明Declaration与定义Definition

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言释疑3:声明Declaration与定义Definition

要弄懂这两者,其实没啥大的困难。可是,至少有半数以上的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专家编程里的例子。

struct veg { int weight, price_per_lb; };

struct veg onion, radish, turnip;

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

我说是声明,按上面的说法,是不分配空间。在这里,这么说,恐怕会有点问题。不分配空间,也就是说,第一个语句不编译出任何代码。对于上面的两个语句,这样说能解释得通。但是,如果我在声明了结构类型后,想动态而不是静态生成结构变量,那在运行时如何按这不存在的东西去生成实体呢?

我没看过含结构类型声明的源代码编译后的目的码,不知道里面有没有与结构类型声明相关的代码。我猜想,这段代码是肯定有的。只是它不是用来运行的,而是用来复制的。你可以把它叫做模板,用来生成实体的模板。运行代码和模板代码可能放在不同的地方。

这个仅仅是猜想而已。曾几次把这猜想写在BBS上,很可惜,没人反对。因为没人反对,也就没法得到验证。

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

struct veg { int 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++里,只能说“声明一个类”,不能说“定义一个类”。类不是实体,代码装入内存时,操作系统并不为它分配空间。以某类为样板可以生成若干个对象,这才是定义。代码装入内存时,操作系统为对象分配空间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 3:11:33

5分钟搞定!腾讯混元HY-MT1.5翻译模型一键部署教程(小白友好)

5分钟搞定!腾讯混元HY-MT1.5翻译模型一键部署教程(小白友好) 1. 引言 你是不是也遇到过这些情况?看英文技术文档一头雾水,需要逐句翻译;给海外客户写邮件,担心表达不地道;或者想快…

作者头像 李华
网站建设 2026/4/15 3:09:59

基于角色的访问控制(RBAC)介绍(Role-Based Access Control)(通过角色来管理用户权限的访问控制模型)角色继承、角色层级、职责分离SoD、互斥角色、ACL、ABAC

文章目录基于角色的访问控制(RBAC)详解一、什么是 RBAC?📌 举个例子二、RBAC 核心模型1️⃣ 用户(User)2️⃣ 角色(Role)3️⃣ 权限(Permission)4️⃣ 资源&a…

作者头像 李华
网站建设 2026/4/15 3:09:58

GitHub加速插件实战手册:3分钟解决国内访问龟速难题

GitHub加速插件实战手册:3分钟解决国内访问龟速难题 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 还在为GitHub下载速…

作者头像 李华
网站建设 2026/4/15 3:04:12

uBlock Origin深度配置指南:从零构建高效广告拦截解决方案

uBlock Origin深度配置指南:从零构建高效广告拦截解决方案 【免费下载链接】uBlock uBlock Origin - An efficient blocker for Chromium and Firefox. Fast and lean. 项目地址: https://gitcode.com/GitHub_Trending/ub/uBlock 现代网页浏览体验中&#xf…

作者头像 李华
网站建设 2026/4/15 3:02:10

RexUniNLU Web服务运维手册:日志定位、异常重启、GPU资源隔离策略

RexUniNLU Web服务运维手册:日志定位、异常重启、GPU资源隔离策略 1. 服务概述与核心价值 RexUniNLU是阿里巴巴达摩院基于DeBERTa架构开发的零样本通用自然语言理解模型,专门针对中文语言特点优化。这个模型最大的特点是无需微调即可完成10种自然语言理…

作者头像 李华
网站建设 2026/4/15 3:02:09

AudioSeal部署案例:高校AI伦理实验室搭建AIGC音频审计沙箱环境

AudioSeal部署案例:高校AI伦理实验室搭建AIGC音频审计沙箱环境 1. 项目背景与价值 在人工智能技术快速发展的今天,音频生成技术(AIGC)已经能够产生高度逼真的人声。这给教育、科研等领域带来了便利,同时也带来了伦理挑战。某高校AI伦理实验…

作者头像 李华