如果我说
int i=8;
在每个函数之外,这个全局变量的定义是暂定的,为什么?
编辑:我将'条件'更改为暂定,我将其翻译错误。
答案 0 :(得分:2)
如果在函数范围之外声明变量,则它具有static storage duration,默认情况下为external linkage。这意味着变量可在当前转换单元中的任何地方访问(即,由预处理器产生的当前C文件)。该变量也可以在其他翻译单元中访问,但您需要将其声明为extern int i;
或tentatively define it作为int i;
。请注意,如果您在文件范围内将变量定义为static int i = 8;
,则该变量将具有internal linkage,并且您无法在其他翻译单元中使用该变量,即使将其声明为{ {1}}。
此处没有条件,我不知道这个词的含义。
编辑
不,你的不是tentative definition。
答案 1 :(得分:2)
如果你已经说明了一个全局变量,那么在该变量之前定义的任何函数都不会知道变量,除非在函数之前或函数内已经做了一些声明。
void foo () {
extern int i; /* declare presence of global i */
/* code that uses i */
}
int i=8;
void bar () {
/* code that uses i, does not need declaration */
}
全局的暂定定义是没有初始化器的裸声明。
int i; /* tentative definition */
void foo () {
/* code that uses i */
}
暂定定义允许i
像前向声明一样使用,但是,除非找到i
的明确外部定义,否则它也将被视为默认的初始化外部定义。