1

我有这个代码:

#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 在这里声明的事实,我会有一个编译错误 - 但一切都过去了。另外,当 extern 在 C 文件本身内部时,它的含义是什么?它不应该在另一个文件中吗?有没有办法声明这个变量以便不编译?

4

3 回答 3

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;

注意xin函数的声明a()b()main()隐藏全局变量x

于 2012-08-01T10:14:43.777 回答
1

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

所以,extern int x;

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

如果您运行此代码,您应该将x的值作为 2 和随后的 4,因为外部 x 变量引用main() 之后的int x=0 。

于 2012-08-01T11:02:36.857 回答
0

extern 用于在编译单元中声明一个变量,该变量是在其他编译单元中定义的。

定义和声明有什么区别?

对于函数,它是可选的。

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

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

于 2012-08-01T10:09:24.967 回答