在任何函数之外声明的C extern变量

时间:2014-01-30 13:42:38

标签: c variables external

我正在查看一个C头文件,它在某些时候有以下声明(代码是由一个称职的人写的所以我认为这不是一个错误。

#ifndef _BLABLA_
#include <stdint.h>

external uint32 x;

#endif

为什么变量声明为外部?只要它与库一起定义,我们就可以确定它不会在另一个函数中使用。 它只是编码风格吗?

2 个答案:

答案 0 :(得分:1)

extern关键字是在编译单元之间共享变量:

这是我可以用来展示它是如何工作的最短的例子:

blabla.c:

int x = 1;

main.c中:

#include <stdio.h>
extern int x;

int main() {
    printf("%d\n", x);
    return 0;
}

汇编:

gcc -o main main.c blabla.c

N.B。:这只是展示其运作方式的一个例子,但这不是一个好的开发实践。

我完全赞同@dasblinkenlight:

使用全局变量是不好的做法,因此很难阅读和理解一个人的代码(即使这是你6个月后阅读的代码)。所以不惜一切代价避免这些!

答案 1 :(得分:1)

不,它不是编码风格。除非变量声明为external,否则编译器也会将声明视为该变量的定义。 globals的定义必须是唯一的;如果你在几个翻译单元中包含一个没有extern的标题(即多个.C文件),你将会遇到链接器错误。

  

我们可以肯定它不会在另一个函数中使用。

实际上,声明变量extern的目的是让包含该标头的任何函数都使用变量x:这样的变量被认为是全局变量。使用大量的全局变量是导致维护难题的常见原因,因此只有在绝对必要时才应引入它们。