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当中只能讲“声明一个类”而不能讲“定义一个类”类并非实体当代码装入内存之际操作系统不会为其分配空间以某类作为样板能够生成若干个对象这才是定义在代码装入内存之时操作系统会为对象分配空间。