我正在查看一个C头文件,它在某些时候有以下声明(代码是由一个称职的人写的所以我认为这不是一个错误。
#ifndef _BLABLA_
#include <stdint.h>
external uint32 x;
#endif
为什么变量声明为外部?只要它与库一起定义,我们就可以确定它不会在另一个函数中使用。 它只是编码风格吗?
答案 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
:这样的变量被认为是全局变量。使用大量的全局变量是导致维护难题的常见原因,因此只有在绝对必要时才应引入它们。