C/C++中extern函数使用详解

C/C++中extern函数使用详解

在C/C++程序中,一个函数可以被多个源文件共用,但是为了让编译器正常编译,需要对函数声明进行处理。关键字extern就是为此而生。

关键字extern

extern关键字可以用来声明一个函数或者变量,它的含义是指这个函数或者变量是在另外一个文件中定义的。

当一个变量或者函数在文件A中被定义,在文件B中被引用时,如果不使用extern关键字进行声明,编译器会认为这是一个新的变量或函数,而不是引用文件A中的变量或函数,导致编译错误。

声明方式

// 函数声明
extern int func();

// 变量声明
extern int num;

在进行函数或者变量声明时,可以不输入具体的函数或者变量实现代码,而只是描述它们的存在。这些被声明的函数或者变量需要在其他文件中被定义,才能使程序正常编译运行。

引用方式

当需要在文件B中使用文件A中的变量或函数时,只需要使用extern关键字进行声明即可。例如:

// a.cpp
int num = 10;

// b.cpp
extern int num;

int main() {
    printf("num in a.cpp is %d\n", num);  // 输出结果为 10
    return 0;
}

在这个例子中,由于文件a.cpp中定义了变量num,在文件b.cpp中使用时需要进行声明。使用extern进行声明之后,就可以在b.cpp中正常使用a.cpp中的变量了。

需要注意的是,如果在头文件中定义了全局变量或函数,需要在其他源文件中再次声明,否则会出现重定义错误。

示例1:实现共享库

我们可以使用extern关键字来实现共享库的功能。例如,我们定义一个print_hello的函数:

// print.c文件
#include <stdio.h>

void print_hello() {
    printf("Hello, World!\n");
}

这个函数在print.c文件中被定义,现在我们想要在其他文件中使用它。我们可以使用extern关键字来声明这个函数,然后可以在其他文件中进行调用:

// main.c文件
#include <stdio.h>

extern void print_hello();

int main() {
    print_hello(); // 通过 extern 声明的函数,在main.c中调用
    return 0;
}

我们可以将print.c编译为静态库或者动态库,然后在编译main.c时进行链接,从而实现调用。

示例2:实现跨文件变量修改

我们可以使用extern关键字来实现跨文件变量修改。例如我们定义一个全局变量:

// var.c文件
int num = 10;

这个全局变量在var.c文件中被定义,现在我们想要在其他文件中修改num的值。我们需要使用extern进行声明,然后在其他文件中进行修改:

// main.c文件
#include <stdio.h>

extern int num; // 声明变量 num

int main() {
    printf("num is %d\n", num); // 输出 num 的当前值
    num = 20; // 通过声明的方式修改变量 num 的值
    printf("num is now %d\n", num); // 输出修改后的 num 的值
    return 0;
}

通过extern关键字声明文件A中定义的变量,我们可以在文件B中对这个变量进行修改,从而实现了跨文件变量修改的功能。

结论

extern是C/C++语言中非常重要的关键字之一,它可以帮助我们实现跨文件的函数调用和变量修改。如果在程序中需要使用跨文件函数或者变量,就一定要使用extern进行声明。同时,使用extern声明的变量和函数也要在其他文件中对它们进行定义,否则会产生编译错误。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++中extern函数使用详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Win10更新TH2失败错误0x8007002c-0x3000d怎么办

    Win10更新TH2失败错误0x8007002c-0x3000d怎么办 在Windows 10操作系统升级到TH2(Threshold 2)时,有可能出现错误代码0x8007002c-0x3000d,导致升级失败。本文将详细讲解如何解决这个问题。 原因分析 错误代码0x8007002c-0x3000d通常表示系统中某些文件损坏或者遭到病毒感染。这些因素可能会…

    C 2023年5月23日
    00
  • C++实现大数相乘算法

    C++ 实现大数相乘算法 当我们需要计算两个超出计算机整数范围的大数相乘时,传统的计算方法已经无法满足需求,因此需要寻找一种适合大数相乘的算法。本文将介绍一种针对大数相乘的算法 – Karatsuba乘法,并使用C++语言进行实现。 Karatsuba 乘法的原理 Karatsuba 乘法的基本思想是将两个大数a和b分别划分为高位和低位,进而利用递归的方法将…

    C 2023年5月22日
    00
  • MFC程序执行过程深入剖析

    MFC程序执行过程深入剖析 前言 MFC(Microsoft Foundation Classes)是一组用于开发Windows界面应用程序的C++类库,开发人员可以使用MFC快速地开发Windows系统下的应用程序。然而,在实际开发中,掌握MFC程序的执行过程是极为重要的,本文深入分析了MFC程序的执行过程。 MFC程序执行过程 MFC程序的执行过程可以被…

    C 2023年5月30日
    00
  • C# Newtonsoft.Json 解析多嵌套json 进行反序列化的实例

    下面是我对这个主题的详细讲解: 标题 “C# Newtonsoft.Json 解析多嵌套json 进行反序列化的实例” 介绍 在现代的Web编程中,JSON是一个非常流行的数据格式,而C#作为一种非常强大的Web编程语言,其处理JSON数据的能力也是非常优秀的。而在C#中,Newtonsoft.Json这个库是一个非常流行和实用的JSON库。它提供了丰富的A…

    C 2023年5月23日
    00
  • C语言朴素模式匹配算法实例代码

    以下是“C语言朴素模式匹配算法实例代码”的完整攻略。 什么是朴素模式匹配算法? 朴素模式匹配算法是一种简单的字符串匹配算法,它基于蛮力法: 遍历主串中的每个字符,每找到一个位置与模式串的第一个字符匹配,就从后续位置开始一个个比较主串和模式串中的字符是否相同,如果某个字符不匹配,则回到主串中对应的位置重新比较。 朴素模式匹配算法的实现原理 下面是C语言实现朴素…

    C 2023年5月22日
    00
  • Qt5.9继承QObject创建多线程实例

    Qt5.9 继承 QObject 创建多线程实例的攻略完整步骤如下: 步骤一:继承 QObject 创建对象 首先,我们需要继承 QObject 类,并将实例化的对象移动到新的线程中。可以使用 moveToThread() 函数来完成此操作。示例如下: class Worker : public QObject { Q_OBJECT public: Work…

    C 2023年5月22日
    00
  • 浅析Objective-C的程序结构及面向对象的编程方式

    浅析Objective-C的程序结构及面向对象的编程方式 本文主要介绍Objective-C的程序结构及面向对象的编程方式。 程序结构 Objective-C的程序结构如下: #import <Foundation/Foundation.h> int main () { NSAutoreleasePool * pool = [[NSAutorel…

    C 2023年5月22日
    00
  • C语言中如何进行多语言支持?

    在C语言中进行多语言支持,其主要的实现方式是通过字符串本地化来实现的。具体步骤如下: 1. 设计国际化字符串 首先,我们需要将所有需要支持的语言的字符串收集到一个字符串池中,并将它们按照关键字进行分类,这个过程被称为字符串本地化(Localization)。例如: // 中文 char *zh[] = { "你好", "世界&q…

    C 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部