关于暂定义

我从一本关于试探性定义的书中读到,

暂时的定义是没有存储类说明符和没有初始化的任何外部数据声明。 如果到达翻译单元的末尾,并且没有定义出现用于标识符的初始化器,则试探性定义变成完全定义

请解释以上声明的含义。 另外,宣言和定义之间的区别? 由于这个,我混了起来。 :(为什么不这个程序给出了一个错误:

#include<stdio.h> int a; //Tentative definition int 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; } 

一个variables声明说:“在程序中有一个variables名称和types如下”。

一个variables定义说:“亲爱的编译器先生,请为以下名称的variables分配内存,然后键入内存。”

所以对同一个variables可以有多个声明,但是只能有一个定义。

在C语言中,纯声明(也不是定义)的前面是关键字extern 。 所以,因为在第一个例子中你没有这个关键字,所以你有两个定义。 就其本身而言,这似乎是一个问题(实际上在C ++中是一个错误),但C有一个特殊的“暂定义”规则,允许同一个variables的多重定义,只要它们匹配,有一个初始化程序。 C编译器在后台将所有的试探性定义合并到一个单一的定义中。

你是否试图初始化这两个定义,如下所示:

 int a = 1; int a = 2; 

那么你会有一个错误。

你的第二个问题更直接。 在C中,你不能在一个函数的主体之外拥有可执行语句。 这是不允许的。 想一想:如果允许的话,你会在什么时候运行呢?

第一个作品是因为你的a的定义都是暂时的,可以按你认为合适的频率复制。 在翻译单元的末尾,没有看到非暂定义的定义,所以你指定的属性和默认值一起给出了最终的定义,所以它会有外部链接,静态存储持续时间和初始化为0。

第二个问题与试探性定义无关。 你的printf("Hi"); 需要在一个function的内部工作 – 这不是一个声明或定义(暂定的或其他)。 这只是不允许的。