Definition(定义) and Declaration(声明)

要弄懂这两者,没啥困难。可是,至少有半数以上的C书没能分清。有的书在某一章节里把这个问题说清楚了,可在其它章节里却乱说一气。真是无奈。

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

对于任何一个实体,Definition必须有一次,也只能有一次。Declaration可以有0次,也可以有任意次。

Definition是真正产生实体,即为其分配存储空间。Declaration并不产生实体,事实上,被Declaration的实体必须是已经存在的。

譬如在源文件A里定义了一个外部的(即在任一函数外面的)整数数组:

       int   iArray[100];

编译器为其分配了400Bytes(如果你用的是32位编译器,每个整数占4Bytes)的空间。

如果你希望另一个源文件B里也能访问这个数组,你必须在文件B的头部对其做外部声明:

       extern     int    iArray[];

这是C专家编程里给出的例子。这例子举得好。你可能已经注意到声明里少了100。书里说得很明白:由于并未在声明中为数组分配内存,所以并不需要提供关于数组长度的信息。

这问题太简单了。你只需记住:对每个实体,定义数必须是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 专家编程里说得很好,结构类型的声明和结构变量的定义,还是分开写好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值