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

文章目录

前言:

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

一、extern 关键字

1、什么是extern?

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

2、基本用法

2.1、声明全局变量

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

cpp 复制代码
// file1.c
int globalVar = 10; // 定义全局变量

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

2.2、声明函数

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

cpp 复制代码
// file1.c
void myFunction() {
    printf("Hello, World!\n");
}

// file2.c
extern void myFunction(); // 显式声明
void callMyFunction() {
    myFunction();
}

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

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

cpp 复制代码
//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++ 编译器,不会对它进行函数名处理,也就是保持原来的函数名。例如:

cpp 复制代码
// 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++提供的头文件都使用下面的格式

cpp 复制代码
#ifndef __TEST
#define __TEST
#ifdef __cplusplus
extern "C" {
#endif
 
//函数声明
 
#ifdef __cplusplus
}
#endif
#endif /* __TEST */

3.2、C++调用C

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

cpp 复制代码
// 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++项目,提高代码的可读性和可维护性。

相关推荐
阿俊-全栈开发5 小时前
LikeShop 单商户SaaS商城分销模块二开:佣金计算与结算逻辑实现
java·开发语言·微服务·likeshop·likeshop开源商城·likeshop多商户
weixin_424183617 小时前
开放—封闭原则实战(下):基于策略的流程编排与编译期多态
c++·分布式·系统架构
Logic1017 小时前
C语言/数据结构位运算题解:异或XOR找出学习计划中的“独特学习时间“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
wuminyu8 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
m0_380743878 小时前
C++中的freopen的用法实例详解
开发语言·c++
jimy19 小时前
polymorph.cpp里面的“析构函数、智能指针”问题
开发语言·c++
朝朝辞暮i9 小时前
C++ 第 6 课:switch —— 多状态选择
开发语言·c++·算法
朝朝辞暮i10 小时前
C++ 第 4 课:if / else —— 让程序自己做决定
开发语言·c++
苏打豆10 小时前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人
蜗牛互联网10 小时前
WSL Containers GA:本地AI容器的生命周期、网络与治理验收
java·网络·人工智能·后端