我有这段代码:
#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的含义是什么?不应该在另一个档案中吗? 有没有办法声明这个变量,以便不编译?
答案 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;
请注意,函数x
,a()
和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。