问题描述
我了解到extern
关键字在函数上下文中是隐式的,因此,除非您另外指定使用static
关键字(,如果我没记错的话,它基本上是完全独立的变量采用static
的概念(它们只共享一个关键字),它们对所有目标文件都是可见的。这很有道理;将声明隐式地放在外部,而当声明与定义在同一文件中时,从技术上讲是不必要的,这很有用,因为程序员不必每次想在其定义之外使用函数时都键入extern
文件,这种情况经常发生。在我看来,奇怪的是声明和定义都是隐式的。
使用变量,不需要在定义中包含extern
,实际上,尽管我可以做到没有错误,但是我的编译器为此警告。
例如,我可以拥有mylib.h
:
int var = 5;
//it isn't necessary to write this as
//extern int var = 5;
//my compiler even warns against it
和test.c
#include "mylib.h"
extern int var;
我通常会假设函数的隐式extern
是相同的,也就是说,如果我在int func(int par)
中定义了mylib.h
,则不会有隐式extern
之前,但任何声明都将包含一个隐式extern
(例如,如果我声明要在test.c
中使用它)。
从extern
关键字的角度来看,这也没有多大意义,该关键字被用来告诉编译器在其他地方查找该定义,当该定义永远不在文件外部时,它是内。
我觉得我在这里想念什么。
解决方法
如果在任何头文件中使用int x = 10;
,那么您将遇到麻烦,因为如果在其他任何文件(.c
或.h
)中包含相同的头文件,与test.c
链接,则将得到错误变量x的重新定义。
您可以自己尝试。
因此,始终将extern int x;
保留在头文件中,
并在任何int x = 10;
文件中定义.c
。
因此,在这种情况下,如果将头文件包含在多个位置,那很好,因为头文件仅具有一个声明,并且可以在多个位置声明相同的变量而没有任何问题。
您可以尝试使用此示例程序来测试错误 “ global_value”的多个定义
test.h
extern int global_value;
test.c
#include <stdio.h>
#include "test.h"
int global_value = 10;
int test_func()
{
printf("golbal_value = %d",global_value);
global_value = 20; // changed here,reflect in main after test_func call
}
main.c
#include <stdio.h>
#include "test.h"
int main()
{
test_func();
printf("global_value = %d\n",global_value);
return 0;
}
以上程序运行完美。要获取错误,请将extern int global_value;
移至test.c
,将int global_value = 10;
移至test.h
并一起编译gcc test.c main.c