C/C++ 知识点:extern 关键字

server/2024/11/20 6:18:15/

文章目录

  • 一、extern 关键字
    • 1、什么是extern?
    • 2、基本用法
      • 2.1、声明全局变量
      • 2.2、声明函数
      • 2.3、使const变量具备外部连接性
    • 3、`extern "C"`特殊用途
      • 3.1、C调用C++
      • 3.2、C++调用C
    • 4、注意事项
    • 5、总结

前言:

在C和C++编程语言中,extern关键字扮演着连接不同源文件(或称为翻译单元)中变量的桥梁角色。它主要用于声明一个变量或函数是在其他地方定义的,即告诉编译器该符号(变量或函数名)在程序的其他部分已经存在,无需在此处重新定义。通过extern,可以实现跨文件的全局变量访问和函数调用,这对于模块化编程和代码组织至关重要。

一、extern 关键字

1、什么是extern?

extern关键字在C++中用于声明一个变量或函数具有外部链接。这意味着该变量或函数的定义在另一个文件中,而不是在当前文件中。使用extern可以避免重复定义,从而实现代码的模块化和组织化。

2、基本用法

2.1、声明全局变量

当在一个源文件中定义了一个全局变量,并希望在另一个源文件中访问它时,就需要在访问它的源文件中使用extern关键字进行声明。这样做可以避免重复定义,同时确保链接器能够找到变量的实际定义位置。

// file1.c
int globalVar = 10; // 定义全局变量// file2.c
extern int globalVar; // 声明全局变量,告诉编译器该变量在其他地方定义
void someFunction() {printf("%d\n", globalVar); // 使用全局变量
}

2.2、声明函数

在C/C++中,当你在一个源文件中定义了一个函数,并在另一个源文件中调用它时,需要显式地使用extern来声明一个函数。

// file1.c
void myFunction() {printf("Hello, World!\n");
}// file2.c
extern void myFunction(); // 显式声明
void callMyFunction() {myFunction();
}

2.3、使const变量具备外部连接性

默认情况下,const 全局变量具有内部链接。 如果希望变量具有外部链接性,需要在定义及使用(其他文件)const全局变量的地方使用extern关键字,例如:

//fileA.cpp
extern const int i = 42; // extern const definition//fileB.cpp
extern const int i;  // declaration only. same as i in FileA

3、extern "C"特殊用途

3.1、C调用C++

如果C要调用C++提供的接口,那么C++提供的接口要用extern "C" 修饰。extern "C" 修饰的函数,通过C++ 编译器,不会对它进行函数名处理,也就是保持原来的函数名。例如:

// cppExample.h
#ifndef __CPP_EXAMPLE_H__
#define __CPP_EXAMPLE_H__#ifdef __cplusplus
extern "C" int add(int x, int y);
#endif#endif// cppExample.cpp
#include "cppExample.h"
int add(int x, int y)
{return x + y;
}// cFile.c
#include <stdio.h>
#include "cppExample.h"int main(int argc, char **argv)
{printf("%d\n", add(10, 20));return 0;
}

一般C++提供的头文件都使用下面的格式

#ifndef __TEST
#define __TEST
#ifdef __cplusplus
extern "C" {
#endif//函数声明#ifdef __cplusplus
}
#endif
#endif /* __TEST */

3.2、C++调用C

C++引用C代码时,引用C头文件的语句需被extern包括。如果不加则会导致编译错误,找不到符号定义。例如:

// cExample.h
extern int add(int x, int y);// cExample.c
#include "cExample.h"
int add(int x, int y)
{return x + y;
}// cppFile.cpp
#include <iostream>
using namespace std;extern "C"{
#include "cExample.h"
}int main(int argc, char **argv)
{cout << add(2, 3) << endl;return 0;
}

4、注意事项

  • extern只能用于声明,不能用于定义。定义变量时需要分配内存空间,而声明只是告诉编译器该变量存在。
  • 如果在头文件中使用extern声明全局变量,那么包含该头文件的所有源文件都能访问这个全局变量。
  • 对于静态存储期的全局变量(即使用static修饰的全局变量),其作用域仅限于定义它的文件,即使在其他文件中使用extern也无法访问。

5、总结

C++中的extern关键字是一种强大的工具,用于声明变量或函数的外部链接。通过使用extern,可以实现跨文件共享和访问,从而提高代码的模块化和可维护性。在使用extern时,需要注意仅声明不定义的原则,并确保每个extern声明都有相应的定义。掌握extern的用法,可以更好地组织和管理大型C++项目,提高代码的可读性和可维护性。


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

相关文章

【计算机体系架构】 MESI缓冲一致性

高并发学习参考 https://blog.csdn.net/MrYushiwen/article/details/123049838 https://cloud.tencent.com/developer/article/2197857 ESI 是指Cache 行的三种一致性状态&#xff1a;E&#xff08;Exclusive&#xff0c;独占&#xff09;&#xff0c;S&#xff08;Shared&…

ClickHouse的介绍、安装、数据类型

1、介绍和安装 1.1、简介 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用SQL查询实时生成分析数据报告。 OLAP&…

TKinter实现与Dash应用的同步启停控制

使用Python集成Tkinter和Dash&#xff1a;创建交互式数据可视化应用 在数据可视化项目中&#xff0c;我们经常需要结合传统GUI和现代Web可视化框架的优势。本文将介绍如何整合Tkinter和Dash&#xff0c;创建一个既有桌面应用界面&#xff0c;又能展示交互式图表的应用程序。 …

Linux登录指令last详解

引言 在Linux系统中&#xff0c;了解用户登录记录是系统管理和安全审计的重要任务之一。last指令作为Linux系统中用于检索和展示用户登录信息的工具&#xff0c;扮演着至关重要的角色。本文将详细介绍last指令的定义、架构、原理、企业应用以及常见的命令体系&#xff0c;帮助…

使用Axios函数库进行网络请求的使用指南

目录 前言1. 什么是Axios2. Axios的引入方式2.1 通过CDN直接引入2.2 在模块化项目中引入 3. 使用Axios发送请求3.1 GET请求3.2 POST请求 4. Axios请求方式别名5. 使用Axios创建实例5.1 创建Axios实例5.2 使用实例发送请求 6. 使用async/await简化异步请求6.1 获取所有文章数据6…

通过华为鲲鹏认证发行上市的集成平台产品推荐

华为鲲鹏认证是技术实力与品质的权威象征&#xff0c;代表着产品达到了高标准的要求。从技术层面看&#xff0c;认证确保产品与华为鲲鹏架构深度融合&#xff0c;能充分释放鲲鹏芯片的高性能、低功耗优势&#xff0c;为集成平台的高效运行提供强大动力。在安全方面&#xff0c;…

Bellman-Ford 和 SPFA 算法的实现DEM路径搜索

首先&#xff0c;假设你已经有一个 2D 数组表示 DEM 数据&#xff0c;每个元素的值表示某个位置的高度。你可以根据特定的规则来决定哪些区域是障碍物或无效值。 Bellman-Ford 算法的实现 #include <iostream> #include <vector> #include <climits> #incl…

C# 常用三方库

C# 第三方库 C# 第三方库日志工具库REST 客户端JSON 处理App.config 文件自定义ConfigSection 的 auto 配置ORM 工具嵌入数据库条码/二维码通讯类组件串口通讯 https://www.nuget.org/packages/GodSharp.SerialPort/Modbus 通讯组件西门子通讯组件Fins协议通讯组件, 报表组件包…