首页 > 编程语言 >C++ const 全局变量跨文件引用,无法解析的外部符号?

C++ const 全局变量跨文件引用,无法解析的外部符号?

时间:2024-01-21 16:55:05浏览次数:31  
标签:文件 const int C++ cpp extern 全局变量

前两天群里有人问了这样一个问题:

在 a 文件中定义了一个全局变量,可以在 b 文件中引用。但一旦把全局变量改为 const 之后,就无法在 b 文件中引用,编译(链接)报错“无法解析的外部符号”,这是为什么?

这是因为 const 修饰的变量默认具有文件作用域,如果想和非 const 变量一样具有全局作用域,需要在定义时(不仅仅只是声明时)显式地增加 extern 关键字。

1. 普通全局变量,跨文件引用OK

// a.cpp
int g = 3;
// b.cpp
#include<iostream>
extern int g;
int main() {
  std::cout << g << std::endl;
}

2. const 全局变量,跨文件引用链接报错

// a.cpp
const int g = 3;
// b.cpp
#include<iostream>
extern const int g; // 链接报错,无法解析的外部符号,找不到 g 的定义!
int main() {
  std::cout << g << std::endl;
}

3 定义 const 变量时显式增加 extern,OK

// a.cpp
extern const int g = 3; // 增加 extern
// b.cpp
#include<iostream>
extern const int g;
int main() {
  std::cout << g << std::endl;
}

标签:文件,const,int,C++,cpp,extern,全局变量
From: https://www.cnblogs.com/tengzijian/p/17978022

相关文章

  • C++中,new与malloc的区别何在?(代码实验向)
    在C++中,new与malloc()都可用于在堆中分配一块内存。其中,new是C++的语法,而malloc则来自古老的C语言,二者在使用时有何区别?new会调用构造函数,而malloc()不会假设有一个矩形类Rect,定义如下:classRect{public:Rect(){/*初始化矩形的宽和高为10*/mWidth......
  • 【C++入门到精通】C++入门 —— 引用、内联函数
     目录一、引用1.引用的概念2.引用的特性3.常引用4.引用的使用场景        ⭕做参数        ⭕做返回值5.传值、传引用效率比较值和引用的作为返回值类型的性能比较6.引用和指针的区别 引用和指针的不同点 二、内联函数1.内联函数的概念2.内联函数的特性3.宏与内......
  • C++多重返回值:引用参数、结构体和元组实例详解
     在C++中,函数通常只能返回一个值。但是,可以通过引用参数、结构体、元组(C++11及以后版本支持)等方式实现函数具有多个返回值的效果。以下是其中几种方法的实例:1.通过引用参数:#include<iostream>//通过引用参数实现多个返回值voidmultipleReturns(inta,intb,int&......
  • 20C++的运算符重载
    C++的运算符重载编译器在做对象运算的时候,会调用对象的运算符重载函数(优先调用成员方法)。如果找不到合适的成员方法,则在全局作用域寻找合适的运算符重载函数.#include<iostream>usingnamespacestd;//复数类classCComplex{private: intmreal; intmimage; //友元函......
  • C++多线程3
    1利用栈特性自动释放锁RAII1.1什么是RAIIRAII(ResourceAcquisitionIsInitialization),使用局部对象管理资源的技术称为资源获取既初始化,它的生命周期由操作系统管理,无需人工干预。为什么要引入自动释放锁,因为我们有时会因为忘记释放锁,而造成死锁或内存泄漏。我们先来手动实......
  • c++函数模板
    一.模板概念:就是建立通用的摸具,大大提高复用性特点:模板不可以直接使用,它只是一个框架模板的通用并不是万能的c++提供两种模板机制函数模板和类模板二.函数模板作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表作用:建立一个通用函数......
  • C++U3-第11课-单、双链表
    学习目标 链表概念计算机存储结构 单链表 实现单链表       删除 插入节点  双向链表  实现双链表         [【数据结构-链表】猴子选大王] 【题意分析】通过循环报数的方式每一次剔除......
  • C++编译全过程
    1.源文件.cpp2.预处理:将所有的#include头文件以及宏定义替换成其真正的内容(删除所有的注释、宏扩展、文件包含).i3.汇编:转换为汇编语言.s4.编译:转换为二进制机器码.o(目标文件)5.链接:链接过程将多个目标文件以及所需的库文件(.so等)链接成最终的可执行文件(executablefile)......
  • 关于C++符号表
    符号表是程序/单元中“符号”的列表。符号通常是变量或函数的名称。符号表可用于确定变量或函数在内存中的位置。简而言之,SymbolTable是分配给函数&变量的名称与其在内存中的地址的映射,包括类型、范围和大小等元数据。最终由编译器使用。通常,C或C++编译器将单个源文件编译......
  • C++模板例子
    title:"C++模板例子"date:2023-11-02T01:05:25+08:00tags:["C++"]categories:[]draft:falsetoc:true#include<vector>#include<type_traits>usingnamespacestd;classAA{};classBB{};classTest{public:templ......