猿问

关于暂定定义

关于暂定定义

我从一本关于暂定定义的书中读到,

暂定定义是没有存储类说明符和初始化器的任何外部数据声明。如果到达翻译单元的末尾,并且没有出现带有标识符初始化器的定义,则暂定定义将成为完整的定义。

请解释上述声明的含义。另外,宣言和定义之间的区别是什么?因为这件事我搞混了。:(为什么这个程序没有给出一个错误:

#include <stdio.h>int a;      
//Tentative definitionint a;      
//similarly this declaration too.int main()  
//not getting any error with this code why its so?{
    printf("hi");}

此外,这个代码有什么问题:

#include<stdio.h>printf("Hi");int main(void){
    return 0;}


千万里不及你
浏览 483回答 3
3回答

红颜莎娜

不,这在C中不违法.在您链接到的问题(以及链接到的答案的问题)中涉及多个文件。同一文件中的多个(兼容)暂定定义并不违反。这一问题的违反是因为,在翻译单位的末尾,如果有没有完全定义的暂定定义,就意味着一个完整的定义。这加上多个文件会导致链接时产生多个定义(除了跨多个文件的暂定定义规则的公共扩展外)

暮色呼如

变量声明表示,“程序中有一个具有以下名称和类型的变量”。变量定义“亲爱的Compiler先生,现在请为一个变量分配内存,其名称和类型如下。”因此,对于同一个变量可以有多个声明,但是应该只有一个定义。在C中,纯声明(也不是定义)前面有关键字extern..因此,由于在第一个示例中没有这个关键字,所以有两个定义。表面上看,这似乎是一个问题(实际上是C+中的一个错误),但是C有一个特殊的“暂定定义”规则,它允许对同一个变量进行多个定义,只要它们都匹配,最多有一个初始化器。C编译器在幕后将所有暂定定义合并到一个定义中。如果您试图初始化这两个定义,如下所示:int&nbsp;a&nbsp;=&nbsp;1;int&nbsp;a&nbsp;=&nbsp;2;那你就犯了个错误。你的第二个问题更直截了当。在C中,您不能在函数正文之外有可执行语句。这是不允许的。想想看:如果允许的话,你希望它什么时候运行?

Qyouu

第一种方法之所以有效,是因为您对a都是试探性的,只要你认为合适,就可以经常重复。在翻译单元的末尾,还没有看到非暂定的定义,因此您为属性指定的内容与默认设置相结合,从而给出了a,因此它将具有外部链接、静态存储持续时间,并被初始化为0。第二个问题与暂定定义无关。你的printf("Hi");需要在一个函数中工作-它不是一个声明或定义(试探性的或其他的);它只是不允许的。
随时随地看视频慕课网APP
我要回答