首页 > 其他分享 >const限定符

const限定符

时间:2024-07-13 18:07:49浏览次数:9  
标签:文件 const 定义 int cpp extern 限定符

2024-7-13
这里特别是关于多文件的const在C++ primer中简单的带过去了,实际上理解起来需要用到其他像编译、链接的知识。

特点:

  • 限定变量只读,因此使用时必须初始化
  • 在多文件中共享const对象,该变量的定义和声明都添加extern关键字。对于const的实现,实际上是由编译器在编译过程中将const变量替换成对应的值,因此在多文件中,如果共享一个const对象,由于const对象都需要进行初始化,将造成重复定义的问题。
// file_1.cpp 定义并初始化了一个常量,该常量能被其他文件访问
extern const int a = GetValue();
// file_1.h 头文件中声明常量 a
extern const int a; // 此时的 a 与 file_1.cpp 中定义的 a 就是同一个

这个时候自然考虑到只在一个文件进行定义,在其他文件进行声明,思考以下例子1

//a.cpp
#include <iostream>
extern const int i; 
int main() {
	std::cout<<i;
	return 0;
}
//b.cpp
 const int i;

这里会报错未定义 i 。

实际上关键在于了解extern关键字的作用:改变const变量的默认链接属性

//fileA.cpp
extern const int i = 42; // 定义变量i并修改默认链接属性为全局可见

//fileB.cpp
extern const int i;  // 声明这个变量在其他文件进行了定义

在例子1中,a.cpp中声明了 a 定义在其他文件中,然而b.cpp中对 i 的定义对a.cpp是不可见的。

但我们还要考虑编译顺序的影响,考虑以下例子2

//1.cpp
extern const int i; //const int i = 1;
const int i = 1; //extern const int i;
int main(){return 0;}
//2.cpp
extern const int i = 2;

只有按1.cpp中注释的写法能通过链接

按照编译的顺序检查文件,先 extern const int i,这时编译器会找这句之前是否对 i 进行了初始化,如果没有,则通过 extern 去文件外部,在 2.cpp 寻找到了对 i 的定义。这时,i 已经完成了定义。回到1.cpp后,发现了 const int i = 1,这时就会报错,重复定义:one or more multiply defined symbols found。按注释顺序,当extern const int i 时,已经在这个文件发现了对 i 的定义,不需要外部链接。
这里关于编译的知识还需要补一下

标签:文件,const,定义,int,cpp,extern,限定符
From: https://www.cnblogs.com/gqzz/p/18300446

相关文章

  • const关键字
    目的:是一种机制可以让代码更加干净,用来规范开发人员有点类似可见性的概念。写法1constint*a=newint;//修饰的inta表面不能修改解引用的内容intb=1;constinta=&b;a=7//会报错;写法2intconsta=newint;//不能修改指向的地址;intc=0;a=&0;//会报错写法3constint......
  • Apple开发_Masonry中 mas_remakeConstraints和mas_makeConstraints的效果是一样的,那么
    1、前言在Masonry布局框架中,mas_makeConstraints和mas_remakeConstraints虽然都用于设置视图的约束,但它们的行为和用途是有区别的。2、功能作用mas_makeConstraintsmas_makeConstraints用于首次为视图创建约束。当你想要为一个新添加的视图或者之前未设置约束的视......
  • Yet Another Permutation Constructive
    这道题目不用写,因为必须要求用kotlin语言讲一下我做这道题目的过程我最开始正着想,如果\(k\)比较大的话,我们就想一次删的数少一点,所以考虑一次操作有哪些数被保留,于是我们发现,原序列的极大值点会被保留,于是一次操作被保留的数最多的情况就是如下的波浪形:然后我们就发现正着想很......
  • Nanami and the Constructive Problem
    线段树优化建图一般用动态开点线段树实现建立对称的入树和出树点击查看代码#include<bits/stdc++.h>usingnamespacestd;vector<int>a[600005];intc[100005],cnt,tot,sum,id[600005],dfn[600005],low[600005],val[100005],n,m;stack<int>s;boolv[600005],h[600005......
  • C++基础知识持续更新,今天来记录结构体的基本知识,包括结构体的定义和使用,结构体数组,结
    C++结构体C++基础知识持续更新,今天来记录结构体的基本知识,包括结构体的定义和使用,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体中的const的使用场景,以及结构体的案例。1.结构体的定义和使用结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。......
  • const修饰指针变量和assert断言
    一.const修饰指针变量一般来说,const修饰指针变量,可以放在*的左边,也可以放在*的右边,两个表示方法的意义是不一样的。1.代码1——测试无const修饰的情况voidtest1(){ intn=10; intm=20; int*p=&n; *p=20;//1 p=&m;//2}在这个代码中1和2所在的语句均可以......
  • 文献阅读-Distributed Constrained Combinatorial Optimization leveraging Hypergra
    DistributedConstrainedCombinatorialOptimizationleveragingHypergraphNeuralNetworks  AbstractScalableaddressingofhighdimensionalconstrainedcombinatorialoptimizationproblemsisachallengethatarisesinseveralscienceandengineering......
  • 基于springboot用“异常处理器“捕获解决“数据库信息录入重复“的问题“SQLIntegrity
    前言 当我们编写后端时,会遇到一个问题,那就是:假如A用户向我们的数据库录入完登录信息后(姓名,账号等),B用户同样采用了一个相同的姓名提交了登录信息,那这个时候就不满足username的唯一约束,此时数据库就会报错例如报错如下:Duplicateentry'····'forkey'····'提示......
  • Paper Reading: Genetic programming for multiple-feature construction on high-dim
    目录研究动机文章贡献预备知识本文方法MCIFC:一种多类无关的特征构建方法CDFC:一种多类相关特征构建方法实验结果数据集和实验设置多特征构造与单特征构造对比多树GP对比单树GPfilter对比混合方法类依赖对比类独立非GP对比基于GP的特征构建优点和创新点PaperReading是从......
  • C/C++ const 和 volatile 关键字要点总结
    const 和 volatile 是C/C++的两个关键字,各有不同的用途和要点。constconst 关键字用于声明常量,一旦声明为常量,其值就不能被修改。const 可以用于各种数据类型,也包括指针、函数参数、函数返回值和类成员函数。声明常量:声明为 const 的常量,在初始化后不能被修改。co......