我从一本关于暂定定义的书中读到,
暂定定义是没有任何外部数据声明
存储类说明符并且没有初始值设定项。暂定定义
如果翻译单元的结尾是
已达到并且没有出现带有初始化程序的定义
标识符
请解释一下上面这句话的意思。
另外,声明和定义之间的区别?我因此而陷入混乱。 :(
为什么这个程序没有给出错误:
#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;
}
一个变量宣言说,“程序中有一个具有以下名称和类型的变量”。
一个变量定义说:“亲爱的编译器先生,请立即为具有以下名称和类型的变量分配内存。”
所以同一个变量可以有多个声明,但只能有一个定义。
在 C 中,纯声明(也不是定义)前面带有关键字extern
。因此,由于您的第一个示例中没有此关键字,因此您拥有的是两个定义。从表面上看,这似乎是一个问题(实际上是 C++ 中的错误),但 C 有一个特殊的“暂定定义”规则,该规则允许在同一翻译单元中对同一变量进行多个定义,只要它们都定义即可匹配并且至多有一个初始化器。 C 编译器在幕后将所有暂定定义组合成一个定义。
您是否尝试初始化这两个定义,如下所示:
int a = 1;
int a = 2;
那么你就会遇到错误。
你的第二个问题更简单。在 C 中,您根本无法在函数体之外拥有可执行语句。这是不允许的。想一想:如果允许的话,您预计它什么时候运行?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)