C语言中,“extern”关键字的含义与用法

server/2024/11/14 1:44:12/

在这里插入图片描述
在C语言中,extern 关键字用于声明一个已经在其他地方定义的变量或函数。它的主要作用是告诉编译器,某个变量或函数是在当前文件之外定义的,编译器应该在链接阶段找到这个变量或函数的实际定义。以下是 extern 的一些常见用途和用法:

1. 声明全局变量

当你在一个文件中定义了一个全局变量,并希望在另一个文件中使用这个变量时,可以在第二个文件中使用 extern 关键字来声明这个变量。

文件1: file1.c
// 定义一个全局变量
int globalVar = 10;
文件2: file2.c
#include <stdio.h>// 使用 extern 声明 file1.c 中定义的全局变量
extern int globalVar;void printGlobalVar() {printf("globalVar = %d\n", globalVar);
}

2. 声明函数

如果你在一个文件中定义了一个函数,并希望在另一个文件中调用这个函数,可以在第二个文件中使用 extern 关键字来声明这个函数。不过,通常情况下,函数的声明已经包含在头文件中,所以直接包含头文件即可。

文件1: file1.c
// 定义一个函数
void myFunction() {// 函数实现
}
文件2: file2.c
#include <stdio.h>// 使用 extern 声明 file1.c 中定义的函数
extern void myFunction();int main() {myFunction();return 0;
}

3. 在头文件中声明

为了更好地组织代码,通常会在头文件中声明全局变量和函数,然后在多个源文件中包含这个头文件。

头文件: common.h
#ifndef COMMON_H
#define COMMON_H// 声明全局变量
extern int globalVar;// 声明函数
void myFunction();#endif // COMMON_H
文件1: file1.c
#include "common.h"// 定义全局变量
int globalVar = 10;// 定义函数
void myFunction() {// 函数实现
}
文件2: file2.c
#include <stdio.h>
#include "common.h"int main() {myFunction();printf("globalVar = %d\n", globalVar);return 0;
}

总结

  • extern 关键字用于声明已经在其他地方定义的变量或函数。
  • 对于全局变量,使用 extern 可以在多个文件之间共享同一个变量。
  • 对于函数,虽然通常不需要显式使用 extern,但在某些情况下(如静态链接库)可能需要使用 extern 来声明函数。

通过合理使用 extern,可以有效地管理和组织大型项目的代码。


http://www.ppmy.cn/server/141369.html

相关文章

c语言中联合Union的作用及示例代码说明

引言 在C语言中&#xff0c;联合&#xff08;Union&#xff09;是一种特殊的数据结构&#xff0c;它允许在相同的内存位置存储不同的数据类型。其它语言中没有类似的语法。 以下是联合的一些作用以及相应的例子。 作用 1 节省空间 联合可以用来节省内存&#xff0c;因为它允…

关于Redis

Redis 基础 什么是 Redis&#xff1f; Redis &#xff08;REmote DIctionary Server&#xff09;是一个基于 C 语言开发的开源 NoSQL 数据库&#xff08;BSD 许可&#xff09;。与传统数据库不同的是&#xff0c;Redis 的数据是保存在内存中的&#xff08;内存数据库&#xf…

原创:使用Qt Creator作为Linux IDE,实现CMake编译和gdb单步调试

1.前期简单步骤参考http://blog.csdn.net/libaineu2004/article/details/78448392 2.Linux下CMake简明教程 http://原文地址&#xff1a;https://blog.csdn.net/whahu1989/article/details/82078563 CMake是开源、跨平台的构建工具&#xff0c;可以让我们通过编写简单的配置…

如何在CentOS 7上搭建SMB服务

如何在CentOS 7上搭建SMB服务 因项目测试需求&#xff0c;需要自行搭建SMB服务&#xff0c;**SMB&#xff08;Server Message Block&#xff09;**协议是一种常用的文件共享方式&#xff0c;它可以让不同操作系统之间共享文件、打印机等资源。本文将带你一步步搭建一个简单的S…

Kafka-Eagle的配置——kafka可视化界面

通过百度网盘分享的文件&#xff1a;kafka-eagle-bin-2.0.8.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1H3YONkL97uXbLTPMZHrfdg?pwdsltu 提取码&#xff1a;sltu 一、界面展示 二、软件配置 1、关闭kafka集群 kf.sh stop 2、将该软件上传到/opt/modules下 cd /opt…

MySQL 到 ClickHouse 数据同步优化(三)

简述 本文主要介绍 CloudCanal 如何将关系型数据库中数据同步到 ClickHouse&#xff0c;默认使用 ReplacingMergeTree 作为 ClickHouse 表引擎&#xff0c;链路特点包括&#xff1a; 新增 _version、_sign 字段&#xff0c;以便 ClickHouse 准确合并。DML 操作均以 INSERT 写…

esayExcel根据模板导出包含图片

1、效果 2、模板 3、工具类代码 /*** 根据模板填充* param response* param templateStream 模板文件流* param map 模板文件所需要的参数* param list list循环模板参数* throws IOException*/public static void templateFilling(HttpServletRequest servletRequest,HttpServ…

【Docker】自定义网络:实现容器之间通过域名相互通讯

文章目录 一. 默认网络&#xff1a;docker0网络的问题二. 自定义网络三. nginx容器指之间通过主机名进行内部通讯四. redis集群容器&#xff08;跳过宿主机&#xff09;内部网络通讯1. 集群描述2. 基于bitnami镜像的环境变量快速构建redis集群 一. 默认网络&#xff1a;docker0…