RON*_*N_L 33 c c++ declaration
为什么这段代码在C中工作但在C++中不工作?
int i = 5;
int i; // but if I write int i = 5; again I get error in C also
int main(){
// using i
}
Run Code Online (Sandbox Code Playgroud)
Pra*_*rav 50
暂定定义是没有存储类说明符且没有初始化程序的任何外部数据声明.
C99 6.9.2/2
对于具有文件范围而没有初始化程序且 没有存储类指定程序或存储类指定程序静态的对象的标识声明构成了一个暂定的定义.如果翻译单元包含一个或多个用于标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,则该行为就像翻译单元包含该标识符的文件范围声明一样,其复合类型为翻译单元的结尾,初始化程序等于0.
这int i是一个暂定的定义.C编译器将所有暂定定义组合成单个定义i.
在C++中,由于One Definition Rule(第3.2/1条ISO C++),您的代码格式不正确
任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义.
//但是如果我
int i = 5;再次写,我也会在C中得到错误
因为在这种情况下,由于初始化器(5),它不再是暂定的定义.
只是为了信息
J.5.11多个外部定义
对象的标识符可能有多个外部定义,有或没有明确使用关键字extern; 如果定义不一致,或者初始化了多个,则行为未定义(6.9.2).
另外,请查看有关外部变量的优秀文章.
Naw*_*waz 11
Tha被称为暂定.它只允许在C.
暂定定义是没有存储类说明符且没有初始化程序的任何外部数据声明.如果到达翻译单元的末尾并且没有出现具有标识符的初始化器的定义,则暂定定义变为完整定义.在这种情况下,编译器会为定义的对象保留未初始化的空间.
以下陈述显示了正常定义和暂定定义.
int i1 = 10; /* definition, external linkage */
static int i2 = 20; /* definition, internal linkage */
extern int i3 = 30; /* definition, external linkage */
int i4; /* tentative definition, external linkage */
static int i5; /* tentative definition, internal linkage */
int i1; /* valid tentative definition */
int i2; /* not legal, linkage disagreement with previous */
int i3; /* valid tentative definition */
int i4; /* valid tentative definition */
int i5; /* not legal, linkage disagreement with previous */
Run Code Online (Sandbox Code Playgroud)
C++不支持暂定定义的概念:没有存储类说明符的外部数据声明始终是一个定义.
从这里:暂定定义