JJJ69 2024-04-11 16:07 采纳率: 92.4%
浏览 1
已结题

解释C语言中的extern关键字?

C语言中的extern关键字:

详述extern关键字在C语言中的作用,尤其是在跨文件共享全局变量和函数时的重要性,通过实例说明如何正确声明和使用extern变量和函数。
  • 写回答

5条回答 默认 最新

  • 生瓜蛋子 2024-04-11 16:27
    关注

    在C语言中,extern关键字用于声明一个变量或函数是在当前编译单元(通常是源文件)之外定义的。它主要服务于两个核心目的:跨文件共享变量和函数、以及避免重复定义。以下是关于extern关键字的详细解释:

    声明外部变量

    1. 跨文件共享变量:当一个全局变量或函数在某个源文件(如fileA.c)中定义,而您想在另一个源文件(如fileB.c)中使用它时,可以使用extern关键字在fileB.c中声明该变量或函数。声明提供了编译器所需的信息,使其知道这个变量或函数存在于其他地方,无需在此处定义。这样做可以实现多个源文件之间的数据或功能共享。

      Example:

      // fileA.c
      int globalVar = 42; // 定义并初始化全局变量
      
      // fileB.c
      extern int globalVar; // 声明已在其他地方定义的全局变量globalVar
      void someFunction() {
          printf("Global variable value: %d\n", globalVar); // 使用外部声明的变量
      }
      
    2. 避免重复定义:在头文件(.h.hpp)中,通常使用extern声明变量,然后在对应的源文件中定义该变量。这样,当多个源文件通过#include包含同一个头文件时,不会导致变量被重复定义的错误。

      Example:

      // shared.h
      extern int sharedVar; // 声明全局变量sharedVar
      
      // fileA.c
      #include "shared.h"
      int sharedVar = 100; // 定义全局变量sharedVar
      
      // fileB.c
      #include "shared.h"
      void useSharedVar() {
          sharedVar++; // 使用已声明并定义的全局变量
      }
      

    声明外部函数

    与外部变量类似,extern也可用于声明在其他文件中定义的函数。在头文件中声明函数,并在对应的源文件中定义函数,是C语言中常见的组织代码的方式,可以确保函数在多个源文件间正确共享。

    Example:

    // utils.h
    extern void doSomething(int arg); // 声明函数
    
    // utils.c
    #include "utils.h"
    void doSomething(int arg) { // 定义函数
        // ...
    }
    
    // main.c
    #include "utils.h"
    int main() {
        doSomething(42); // 使用已声明的外部函数
        return 0;
    }
    

    注意事项:

    • extern用于声明函数时,通常可以省略。编译器默认函数声明为extern,除非显式声明为static。不过在头文件中包含函数声明时,为了保持一致性,通常仍然会写上extern

    • extern关键字仅用于声明,不能用于定义。定义变量或函数时不应使用extern,除非同时指定了链接属性(如extern "C"用于C++中声明C语言编译的函数)。

    • 对于全局变量,extern声明时可以省略初始值,因为在其他地方已有定义。如果提供了初始值,声明将被视为定义。

    总结来说,C语言中的extern关键字主要用于跨文件共享变量和函数,通过声明而非定义的方式告知编译器这些实体存在于其他编译单元中。合理使用extern可以有效地组织代码、避免重复定义,并实现模块间的通信。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 创建了问题 4月11日

悬赏问题

  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图