关于暂定义
我从一本关于试探性定义的书中读到,
暂时的定义是没有存储类说明符和没有初始化的任何外部数据声明。 如果到达翻译单元的末尾,并且没有定义出现用于标识符的初始化器,则试探性定义变成完全定义
请解释以上声明的含义。 另外,宣言和定义之间的区别? 由于这个,我混了起来。 :(为什么不这个程序给出了一个错误:
#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的内部工作 – 这不是一个声明或定义(暂定的或其他)。 这只是不允许的。