关闭

Definition(定义) and Declaration(声明)

标签: struct编译器编程bbsbugsobject
1968人阅读 评论(1) 收藏 举报

要弄懂这两者,没啥困难。可是,至少有半数以上的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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31077次
    • 积分:437
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:0篇
    • 译文:0篇
    • 评论:41条
    文章存档
    最新评论