为什么函数定义在C中隐式地在外部?

问题描述

我了解到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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...