首页 > 编程语言 >C/C++ 知识点:extern 关键字

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

时间:2024-11-18 16:17:47浏览次数:3  
标签:__ 知识点 定义 int C++ extern 全局变量

文章目录


前言:

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

标签:__,知识点,定义,int,C++,extern,全局变量
From: https://blog.csdn.net/cloud323/article/details/143859372

相关文章

  • 什么是 C++ 中的友元函数和友元类?友元的作用是什么?有什么注意事项?
    友元函数(FriendFunction)定义友元函数是在类定义中用关键字friend声明的非成员函数。它可以访问类的私有(private)和保护(protected)成员。作用和使用场景友元函数主要用于在某些情况下,需要在类的外部函数中访问类的私有或保护成员。例如,在操作符重载中,当需要访问类的私有数......
  • 打卡信奥刷题(262)用C++信奥P2004[普及组/提高] 领地选择
    领地选择题目描述作为在虚拟世界里统帅千军万马的领袖,小Z认为天时、地利、人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小Z来说是非常重要的。首都被认为是一个占地C×......
  • 线性代数知识点复习——范数
    范数(Norm)是数学中的一个概念,用于度量向量、矩阵或张量的大小或长度。范数是向量空间上的一种函数,能够将向量映射为非负实数,表示向量的某种“长度”或“大小”。    ......
  • 代码随想录算法训练营第三十二天| 509. 斐波那契数 、70. 爬楼梯、746. 使用最小花费
    理论基础总结一下就是:动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。动态规划五部曲确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组509.斐波那契数1.......
  • 代码随想录算法训练营第三十三天| 62.不同路径 、63. 不同路径 II、343. 整数拆分 。c
    62.不同路径思路:按照dp五步法分析,成功AC。代码随想录classSolution{publicintuniquePaths(intm,intn){int[][]dp=newint[m+1][n+1];dp[0][1]=1;for(inti=1;i<=m;i++){for(intj=1;j<=n;j++){......
  • 新版华为认证全套资料(题库试题、知识点速记、考试大纲、思维导图、面试宝典)
    话不多说,直接上硬菜!一、HCIA、HCIP题库试题华为认证考试题型有单选、多选、判断、填空、拖拽题,每种题型常考什么知识点,各种知识点又会以什么样的方式去考察,都需要我们在不断刷题练习中去熟悉!HCIA题库试题:1、以下关于路由器的描述,说法错误的是?()A、路由器可以作为网关设备......
  • C++多线程编程
    一、概念多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。传统的C++(C++11标准之前)中并没有引入线程这个概念,在C++11出来之前,如果我们想要在C++中实现多线程,需要借助操作系统平台提供的API,比如Linux的<pthread.h>,或者windows下的<windows.h>。1.1其......
  • C++ 中的线程、锁和条件变量
    C++中的线程、锁和条件变量Created:2024-06-19T17:17+08:00Published:2024-11-18T10:39+08:00Categories:C-CPP目录线程创建与执行锁lockguardexamplemutex底层实现解释byGPT条件变量(conditionvariable)线程从cv.wait(lock)被唤醒后会自动抢锁虚假唤醒生产者消费......
  • C++二级:数字字符求和
    数字字符求和请编写一个程序实现以下功能:从一个字符串中,提取出所有的数字字符即0-9,并作为数求和。输入一行字符串,长度不超过100,字符串中不含空格。输出字符串中所有数字字符作为数的和样例输入Lsd2f02k3ja3sdf223样例输出171、数字字符求和请编写一个程序实现以下功......
  • C++刷题第十题——求奇数的乘积
    ProblemDescription给你n个整数,求他们中所有奇数的乘积。Input输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数,你可以假设每组数据必定至少存在一个奇数。Output输出每组数中的所有奇数的乘积,对于测试实例,输出一行。Sa......