C++中的extern声明变量详解

C++中的extern声明变量详解

什么是extern声明变量

extern关键字用于声明一个变量是在其他文件中定义的,可以在当前文件中使用。其作用是告诉编译器不要在当前文件中寻找这个变量的定义,而在其他文件中寻找。

为什么要使用extern声明变量

当我们在一个项目中使用多个文件时,每个文件都有自己的作用域。如果我们想在多个文件中使用同一个变量,那么就需要在这些文件中声明同一个变量。在C++中,一个变量只能被定义一次,如果在多个文件中都定义了同一个变量,编译器会报错。所以,我们需要使用extern关键字来声明这个变量是在其他文件中定义的。

如何使用extern声明变量

在当前文件中使用其他文件中定义的变量,需要在使用前先对变量进行extern声明。示例代码如下:

// file1.cpp
int num = 10;
// file2.cpp
#include <iostream>
using namespace std;
extern int num;  // extern声明变量

void printNum(){
    cout << "num = " << num << endl;
}

在file2.cpp文件中,我们对于在file1.cpp中定义的变量num进行了extern声明,这样我们就可以在file2.cpp中使用变量num了。

使用extern和不使用extern的区别

我们可以将示例代码中printNum函数进行一下改变:

void printNum(){
    extern int num;
    cout << "num = " << num << endl;
}

这样,在使用变量num时,我们没有使用extern关键字。实际上,在使用变量时,使用extern和不使用extern是一样的,编译器会自动将未定义的变量当作extern声明的变量处理。但是,为了明确地告诉编译器变量是在其他文件中定义的,我们最好使用extern关键字。

总结

使用extern关键字,可以在一个文件中使用其他文件中定义的变量,从而避免在多个文件中定义同一个变量而导致的编译错误。在使用变量时,使用extern和不使用extern是一样的,但为了明确地告诉编译器变量是在其他文件中定义的,我们最好使用extern关键字。

示例1

// file1.cpp
int num = 10;
// file2.cpp
#include <iostream>
using namespace std;
extern int num;

int main(){
    cout << "num = " << num << endl;
    return 0;
}

示例2

// file1.cpp
extern int num;
void setNum(int value){
    num = value;
}
// file2.cpp
#include <iostream>
using namespace std;
int num;

int main(){
    setNum(10);
    cout << "num = " << num << endl;
    return 0;
}

在示例2中,我们使用extern声明了变量num,然后在另外一个文件中定义了这个变量,并且通过setNum函数设置了变量num的值,最后在主函数中输出了变量num的值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中的extern声明变量详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 一文搞懂Spring中@Autowired和@Resource的区别

    下面我就来详细讲解一下 “一文搞懂Spring中@Autowired和@Resource的区别”的完整攻略。 1. 背景知识 在讲解 @Autowired 和 @Resource 之前,我们先来简要了解一下Spring中的IOC和DI。IOC(Inversion of Control),即控制反转,是指将创建对象的主动权交给Spring框架,由Spring框…

    other 2023年6月26日
    00
  • c++拷贝(复制)构造函数详解

    C++拷贝(复制)构造函数详解 在 C++ 中,拷贝构造函数提供了一种从一个对象复制到另一个对象的方法。本文将详解 C++ 中的拷贝构造函数的作用和实现机制。 什么是拷贝构造函数? C++ 中的拷贝构造函数是一种特殊的构造函数,用于将一个对象复制到另一个对象。当需要创建新的对象并将其初始化为已有对象的副本时,拷贝构造函数就会派上用场。 拷贝构造函数有一些特殊…

    其他 2023年3月28日
    00
  • Java多线程并发编程和锁原理解析

    Java多线程并发编程和锁原理解析 什么是多线程并发编程? 多线程并发编程是指在同一时间段内,运行多个线程,让它们同时进行不同的任务或处理同一个任务的不同部分。这种并发执行的效果可以让程序的性能得到极大的提高,进而可以提高程序的并发度和并行度。 为什么需要多线程并发编程? 在一些需要处理大量计算和I/O等耗时的任务时,使用单线程会有很大的性能瓶颈,这时候就需…

    other 2023年6月27日
    00
  • Android Socket实现多个客户端即时通信聊天

    下面是Android Socket实现多个客户端即时通信聊天的完整攻略: 什么是Socket通信? Socket通信是指通过网络协议栈,将数据从一个进程中传递到另一个进程的机制。Socket通信可以用于实现客户端和服务器之间的通信。在传统的C/S架构中,服务器端通过Socket监听一个特定的端口,等待客户端的连接,一旦有了客户端的连接请求,服务器就会为该连接…

    other 2023年6月25日
    00
  • 图文详解Linux服务器搭建JDK环境

    图文详解Linux服务器搭建JDK环境 在Linux服务器上搭建Java Development Kit (JDK)环境是开发Java应用程序的必要步骤。下面是在Ubuntu Linux操作系统上完整地搭建JDK环境的攻略。 步骤1:安装Java软件包管理器 在Ubuntu系统上,Java软件包管理器(PPA)可以帮助我们方便地安装和管理JDK。首先,我们需…

    other 2023年6月27日
    00
  • windows下mysql 5.7.20 安装配置方法图文教程

    Windows下MySQL 5.7.20安装配置方法图文教程 下载安装包 首先,我们需要去MySQL官网上下载安装包,下载地址为:https://dev.mysql.com/downloads/mysql/5.7.html 在该页面中,我们选择Windows操作系统,选择对应的位数(32位或64位),选择ZIP Archive下载。 解压安装包 下载完成后,…

    other 2023年6月27日
    00
  • golang如何使用gomobile进行Android开发

    Golang使用Gomobile进行Android开发攻略 Gomobile是一个用于在Go语言中编写和构建移动应用程序的工具。它允许开发人员使用Go语言编写Android应用程序,并将其编译为可在Android设备上运行的原生代码。以下是使用Gomobile进行Android开发的详细攻略。 步骤1:安装Gomobile 首先,您需要安装Gomobile工…

    other 2023年9月7日
    00
  • 利用SQL Server触发器实现表的历史修改痕迹记录

    以下是利用SQL Server触发器实现表的历史修改痕迹记录的完整攻略: 步骤1:创建历史记录表 首先,创建一个用于存储历史修改痕迹的表。假设我们有一个名为OrderHistory的表,包含以下字段:order_id、modified_date、modified_by和modification_details。 CREATE TABLE OrderHisto…

    other 2023年10月17日
    00
合作推广
合作推广
分享本页
返回顶部