为了账号安全,请及时绑定邮箱和手机立即绑定

关于暂定定义

关于暂定定义

C C++
哈士奇WWW 2019-07-12 10:38:10
关于暂定定义我从一本关于暂定定义的书中读到,暂定定义是没有存储类说明符和初始化器的任何外部数据声明。如果到达翻译单元的末尾,并且没有出现带有标识符初始化器的定义,则暂定定义将成为完整的定义。请解释上述声明的含义。另外,宣言和定义之间的区别是什么?因为这件事我搞混了。:(为什么这个程序没有给出一个错误:#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;}
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-07-12
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

变量声明表示,“程序中有一个具有以下名称和类型的变量”。

变量定义“亲爱的Compiler先生,现在请为一个变量分配内存,其名称和类型如下。”

因此,对于同一个变量可以有多个声明,但是应该只有一个定义。

在C中,纯声明(也不是定义)前面有关键字extern..因此,由于在第一个示例中没有这个关键字,所以有两个定义。表面上看,这似乎是一个问题(实际上是C+中的一个错误),但是C有一个特殊的“暂定定义”规则,它允许对同一个变量进行多个定义,只要它们都匹配,最多有一个初始化器。C编译器在幕后将所有暂定定义合并到一个定义中。

如果您试图初始化这两个定义,如下所示:

int a = 1;int a = 2;

那你就犯了个错误。

你的第二个问题更直截了当。在C中,您不能在函数正文之外有可执行语句。这是不允许的。想想看:如果允许的话,你希望它什么时候运行?


查看完整回答
反对 回复 2019-07-12
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

第一种方法之所以有效,是因为您对a都是试探性的,只要你认为合适,就可以经常重复。在翻译单元的末尾,还没有看到非暂定的定义,因此您为属性指定的内容与默认设置相结合,从而给出了a,因此它将具有外部链接、静态存储持续时间,并被初始化为0。

第二个问题与暂定定义无关。你的printf("Hi");需要在一个函数中工作-它不是一个声明或定义(试探性的或其他的);它只是不允许的。


查看完整回答
反对 回复 2019-07-12
  • 3 回答
  • 0 关注
  • 468 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信