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里只能说“声明一个类”不能说“定义一个类”。类不是实体代码装入内存时操作系统并不为它分配空间。以某类为样板可以生成若干个对象这才是定义。代码装入内存时操作系统为对象分配空间。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2518553.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!