何时在C条件中定义全局变量?

时间:2016-02-09 21:47:11

标签: c variables global

如果我说

int i=8;

在每个函数之外,这个全局变量的定义是暂定的,为什么?

编辑:我将'条件'更改为暂定,我将其翻译错误。

2 个答案:

答案 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的明确外部定义,否则它也将被视为默认的初始化外部定义。