C语言 了解extern关键字

最重要的结论:
extern在项目中不是必须的。如果在一个项目中遇到有extern声明的变量或者函数,知道其作用即可。C++中已经完全见不到extern关键字了,有更好的方式。

extern主要有两个用途:

  • extern 修饰全局变量,改变全局变量的生命周期或者作用范围
  • 让被 extern “C” 修饰的变量和函数是按照 C 语言方式编译和链接的

目前用的最多的是后一种。

1.extern 修饰全局变量或函数

被 extern 限定的函数或变量是 extern 类型的,且被修饰的变量一定是全局的,局部变量不能被extern修饰。
如果在同一个源文件下,用extern修饰全局变量,是为了扩大全局变量的生命周期
如果全局变量不在文件的开头定义,有效的作用范围将只限于其定义处到文件结束。如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键字 extern 对该变量作“外部变量声明”,表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

#include <stdio.h>
int max(int x,int y);
int main(void)
{
    
    
    int result;
    /*外部变量声明*/
    extern int g_X;
    extern int g_Y;
    result = max(g_X,g_Y);
    printf("the max value is %d\n",result);
    return 0;
}
/*定义两个全局变量*/
int g_X = 10;
int g_Y = 20;
int max(int x, int y)
{
    
    
    return (x>y ? x : y);
}

不在同一个源文件下修饰,是为了引用该全局变量,但是这样的作法通常是危险的,因为被引用就意味着可以修改该全局变量。

/****max.c****/
#include <stdio.h>
/*外部变量声明*/
extern int g_X ;
extern int g_Y ;
int max()
{
    
    
    return (g_X > g_Y ? g_X : g_Y);
}
/***main.c****/
#include <stdio.h>
//定义两个全局变量
int g_X=10;
int g_Y=20;
int max();
int main(void)
{
    
    
    int result;
    result = max();
    printf("the max value is %d\n",result);
    return 0;
}

这样的作法并不高明,因为这真的不是必须的。完全可以通过参数传递,将g_X和g_Y传如max函数,再将max函数在公共头文件声明即可。

2.被 extern “C” 修饰的变量和函数

被 extern “C” 修饰的变量和函数是按照 C 语言方式编译和链接的
extern “C” 的作用是让 C++ 编译器将 extern “C” 声明的代码当作 C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题。

extern “C” 使用

#ifdef __cplusplus
extern "C" {
    
    
#endif

void *memset(void *, int, size_t);

#ifdef __cplusplus
}
#endif

猜你喜欢

转载自blog.csdn.net/changyi9995/article/details/108237711