如何在C中使用extern?

时间:2012-08-01 10:06:43

标签: c compilation declaration extern

我有这段代码:

#include <stdio.h>

extern int x;
void a() {
    int x = 100;
    printf("%d ",x );
    x += 5;
}

void b() {
    static int x = -10;
    printf("%d ", x);
    x += 5;
}

void c(){
    printf("%d ", x);
    x += 2;
}

int main() {
    int x = 10;
    a();
    b();
    c();
    a();
    b();
    c();
    printf("%d ", x);
    getchar();
    return 0;
}

int x = 0;

我确信extern在这里声明的事实,我将有一个编译错误 - 但一切都通过了。 另外,当它在C文件本身内部时,extern的含义是什么?不应该在另一个档案中吗? 有没有办法声明这个变量,以便不编译?

3 个答案:

答案 0 :(得分:2)

extern关键字声明一个变量,并告诉编译器在其他地方有一个定义。对于发布的代码,x的定义发生在main()之后。如果在int x = 0;之后移除main()代码将无法构建(它将编译但由于未定义的符号x而无法链接)。

extern通常用于在头文件中声明变量(或函数),并将定义放在单独的源(.c)文件中,以使相同的变量可供多个翻译单元使用(并避免使用多重定义错误):

/* my.h */
#ifndef MY_HEADER
#define MY_HEADER
extern int x;
#endif

/* my.c */
#include "my.h"
int x = 0;

请注意,函数xa()b()中的main()声明会隐藏全局变量x

答案 1 :(得分:1)

您在文件范围内有一个标识符声明,因此如果标识符的其他声明没有存在于文件范围内,则标识符将具有外部链接。但是,您已经在粘贴的代码中的最后一行的文件范围定义了标识符。

所以,extern int x;

指的是文件底部的全局定义:int x = 0;。 :)

如果你运行这段代码,你应该将 x 的值设为2,然后是4,因为externed x变量引用了main之后的 int x = 0 ( )。

答案 2 :(得分:0)

Extern用于在编译单元中声明变量,此变量在其他编译单元中定义。

What is the difference between a definition and a declaration?

对于功能,它是可选的。

阅读:http://en.wikipedia.org/wiki/External_variable

在你的代码中,三个函数中的每一个都使用另一个'i'。只有c()使用全局x。