首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++又一坑:动态链接库中的全局变量

模块 a, 静态库 a 模块 b, 二进制 b, 静态引用a, 动态加载c 模块 c, 动态链接库c, 静态引用a 关键在于静态库a里有一个静态全局变量,没错就是我们的日志模块。...原先的这个静态的模块中的静态全局变量是有构造函数的,也就是构造函数干了点事情。 我们都知道,程序载入在进入主函数前会依次初始化全部的全局和静态变量。载入动态链接库时也不例外。...这时候矛盾就来了,二进制b在进入主函数前会初始化模块a中的全局变量,执行构造函数;然而载入动态链接库c时,也会启动对c内的全局变量进行初始化,也会执行同一个对象的构造函数。...foo_class::~foo_class(), this-> 0x600f98 foo_class::~foo_class(), this-> 0x600f98 从结果中可以看出来,在Linux中多个动态链接库和主程序引用的同一个全局变量...PS: 如果不是直接使用的全局变量,而是直接使用函数接口,并且返回一个static的局部变量这种方式,测试结果也是一样的; 而且如果不是通过dlopen动态加载,而是通过编译时链接进去的话,也是构造了两次

7.2K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++ 指针常量与常量指针

    吐槽一下: 指针常量与常量指针的翻译就好比机器学习中Regularization翻译成正则化一样,讲真,正则化这个说法确实要比规则化显得高端些,但是到了理解的时候,还是要按照规则化理解。...而不管是指针常量还是常量指针他们的区别其实就是const关键字的位置,下面直接根据声明方式不同解释二者的区别: 在只有一个关键字const的情况下,声明有三种方式: //1 const int* p...所以被指向的数据的值到底能不能改变根本不由指针的声明方式决定,而是该数据本身是常量还是变量。.../合法 p = &b;//不合法 以上就是所谓的指针常量与常量指针所包含的概念,在这里标个号: 1,2暂时称为第一类,3暂时称为第二类,那么第一类和第二类到底哪个叫做指针常量,那个叫做常量指针呢?...说实话我都不知道指针常量与常量指针的叫法是不是够官方,我只能说概念非常混淆,而且其实它的两个名字并不重要,关键的是声明方式与作用的区别。

    1.7K70

    c++ 常量表达式_c++符号常量

    大家好,又见面了,我是你们的朋友全栈君。 常量表达式主要是允许一些计算发生在编译时,即发生在代码编译阶段而不是代码运行阶段。...这是很大的优化,因为如果有些事情可以在编译时做,那么它只会做一次,而不是每次程序运行时都计算。...函数中只能有一条return语句 函数必须有返回值 在使用前必须定义 return返回语句表达式中不能使用非常量表达式的函数、全局数据。...static_assert(1, "fail"); return 100; } int a = 3; constexpr int data3() { return a;// return返回语句表达式中不能使用非常量表达式的函数...func();//函数声明,定义放在main后面 constexpr int c = func();// 无法通过编译,在使用前必须已经有定义 system("pause"); return 0; } 常量表达式的构造函数有以下限制

    30250

    c++常量和常量表达式

    rci = 90;//错误 不能修改 允许常量引用绑定到非常量的对象、字面值或表达式上 int i = 20; const int &ri(20); const int &ri3(i + ri); 常量引用仅对引用可参与的操作作出了限定...,pci1的值可以改变,pcil指向的值不能变 pci1 = &iv1; iv = 30; int * const pci2(&iv);//常量指针,把指针本身定位常量,pci2的值不能改变,pci2指向的值可以改变...字面值和constexpr 常量表达式:字面值是常量表达式,用常量表达式初始化的const对象也是常量表达式 const int ci = 20;//ci是常量表达式 const int cii = ci...+ 90;//cii是常量表达式 int iv = 30;//iv不是常量表达式 声明为constexpr的变量一定是常量,而且必须用常量表达式初始化 constexpr int cif = 23;...发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187801.html原文链接:https://javaforall.cn

    59920

    C++常量与变量

    参考链接: C++变量, 字面量和常量 日期:2020年3月27日 作者:Commas 注释:开始我的C++学习的奇妙之旅,愿意和我一起学习的小伙伴们可以关注我,也可以给我点赞,如若博客有哪里写的不好的地方...,还望各位看官指出,非常感谢…… 更多C++内容,请看我的《C++学习的奇妙之旅》   文章目录  一、前言二、基本数据类型三、常量(一)常量的类型(1)整数常量(2)浮点常量(3)布尔常量(4)字符与字符串常量...类型读写说明常量仅只读,在定义并初始化后,不可修改原值变量可读写,在程序运行中,可以修改变量值 二、基本数据类型  在C++中,数据类型决定了变量存储的大小和布局,基本数据类型可分为以下4类:  整数类型...在标准C++类库中有一个String类,这个是值得推荐的,很C++字符串风格。...int i,j,k; //(2)定义单个变量 double d; (二)变量的定义并且初始化  分配了这些字节空间后,变量的初始值是什么,得分以下情况讨论:  全局变量:所有函数体之外的变量,如果不给初始值

    68540

    C++临时变量的常量性

    1.认识临时变量的常量性 关于临时变量的常量性,先看一段代码。...2.临时变量常量性的原因 为什么临时对象作为引用参数传递时,形参必须是常量引用呢?很多人对此的解释是临时变量是常量,不允许赋值改动,所以作为非常量引用传递时,编译器就会报错。...注意,这里与《C++编程思想》在第八章中的“临时量”小节中认为“编译器使所有的临时量自动设为const”的说法有些不同。 那编译器为何作出如此限制呢?...但如果把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,临时变量所在的表达式执行结束后,临时变量就会被释放,所以,一般说来, 修改一个临时变量是毫无意义的,据此,C++编译器加入了临时变量不能作为非...---- 参考文献 [1]c++中临时变量不能作为非const的引用参数 [2]C++编程思想[M].刘宗田译.8.3.2.1临时量

    2K31

    C++:18---const关键字(附常量指针、指针常量、常量指针常量)

    ②其他文件的全局变量会报错,显示重定义 方法: 在demo.h文件中extern const int a;//声明 在demo.c文件中extern const int a=1;(extern可省略)...三、const和引用 把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为“对常量的引用” 与普通的引用不同的是,对常量的引用不能被用作修饰它所绑定的对象: const int ci =...: ①在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转成引用的类型即可(见下面代码段1) ②允许为一个常量引用绑定非常量的对象、字面值、甚至是个一般表达式(见下面代码段2) //代码段...指向常量的指针)。...指向可以改,但是不能通过该指针改变所指向的值 这种类型的const也被称为“底层const”:表示指针所指向的值是个常量 指针常量:(指针的常量)。

    1.4K10

    C++常量const建议收藏

    大家好,又见面了,我是全栈君 常量折叠概念   常量折叠表面上的效果和宏替换是一样的,只是“效果上是一样的”,而两者真正的区别在于,宏是字符常量,在预编译宏替换完成后,该宏名字会消失,所有对宏的引用已经全部被替换为它所对应的值...,编译器当然没有必要维护这个符号,而常量折叠发生的情况是,对常量的引用情况全部替换为该常量的值,但是,常量名并不会消失,编译器会把它放入到符号表中,同时会为该变量分配空间,栈空间或全局空间。...const在C和C++中的区别 const int buffsize = 10; char buff[buffsize];   上面的代码在C++中可以,但在C中不行,因为buffsize占用存储的某个地方...,所以C编译器不指定它在编译时的值 const int buffsize;   上面的代码在C中可以,因为在C中默认const为外部链接,C++默认const为内部链接,所以再C++中要写成extern...在一个类里使用const的意思是“在这个对象寿命周期内,这是一个常量”。然而,对这个常量来讲,每个不同的对象可以含一个不同的值。

    30430

    【C++】C++ 引用详解 ⑨ ( 常量引用初始化 | C C++ 常量分配内存的四种情况 )

    " 常量 / 字面量 " 初始化 " 常量引用 " 在 博客 【C++】C 语言 和 C++ 语言中 const 关键字分析 ( const 关键字左数右指原则 | C 语言中常量的原理和缺陷 | C...++ 语言中常量原理 - 符号表存储常量 ) 中 , 详细的分析了常量的本质 , 如果 定义 " 普通常量 " , 那么该 常量 是 定义在了 符号表 中 ; // 定义普通常量 , 将 m 定义在了..." , 引用一个字面量 , 字面量 是 数值 , 这是合法的 ; // 常量引用 引用字面量 , 不会报错 const int& n = 30; 上述用法 , C++ 编译器 会为 常量引用 n...分配一个内存空间 , 这是 const 常量分配内存空间的 三种情况之一 ; 3、C / C++ 常量分配内存的四种情况 C 语言中 const 常量 是 只读变量 , 有独立的存储空间 ; C++ 语言中的...使用 普通变量 初始化 常量引用 // 定义变量 a int a = 10; // 定义变量 a 的 常量引用 b // 使用 普通变量 初始化 常量引用 const int& b = a;

    28830

    【C++】C++ 引用详解 ⑩ ( 常量引用案例 )

    在 C++ 语言中 , 常量引用 是 引用类型 的一种 ; 借助 常量引用 , 可以将一个变量引用 作为实参 传递给一个函数形参 , 同时保证该值不会在函数内部被修改 ; 这样既保证了参数传递效率 ,...有保证了数据安全 ; 常量引用 的重要使用场景 : 函数参数传递 函数返回值 对象成员 本篇博客会给出 常量引用 的几种案例 ; 一、常量引用语法 1、语法简介 使用 " 普通变量 " 初始化 " 常量引用...如 : int , string ; variable_name 是 常量引用 的名称 , 调用该常量引用 , 不可修改 value 变量的值 ; value 是 被引用的 变量 , 调用该变量可以修改变量的值...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 正确代码示例 : // 包含 C++ 头文件 #include "iostream" //...定义一个函数 , 接收结构体类 类型的 常量引用 , 则 结构体常量引用 指向的 对象成员不能被修改 ; 定义的结构体类如下 : // 定义一个结构体类型, 之后使用该类型的常量引用进行测试 struct

    26730

    【C++】C++ 引用详解 ⑧ ( 普通引用与常量引用 | 常量引用概念与语法 )

    一、普通引用 1、概念说明 之前的 【C++】C++ 引用详解 ① ~ ⑦ 博客中 , 讲解的都是 普通引用 , 也就是 将 普通变量 赋值给 引用 , 过程如下 : 先定义 普通变量 a , 然后定义...二、常量引用 ---- 1、常量引用引入 与 变量引用 相对的就是 常量引用 ; 通过 普通引用 , 可以修改 变量的值 ; 常量引用 , 是不可修改的 , 声明一个 普通变量 的 常量引用 , 之后不再使用...: error C3892: “b”: 不能给常量赋值 2、常量引用概念与语法 在 C++ 语言中 , " 常量引用 " , 英文名称为 Const Reference , 是一种引用类型 , 另外一种引用就是...常量引用 的名称 , 调用该常量引用 , 不可修改 value 变量的值 ; value 是 被引用的 变量 , 调用该变量可以修改变量的值 ; 2、代码示例 - 常量引用不可修改 在下面的函数中 ,...常量引用 b 修改 变量 a 的值 , 则会报错 : error C3892: “b”: 不能给常量赋值 错误代码示例 : // 包含 C++ 头文件 #include "iostream" //

    39411

    C++静态链接

    C++ 的一些语言特性使之必须由编译器和链接器共同支持才能完成工作。最主要的有两个方面,一个是C++ 的重复代码消除,还有一个就是全局构造与析构。...另外由于C++ 语言的各种特性,比如虚拟函数、函数重载、继承、异常等,使得它背后的数据结构异常复杂这些数据结构往往在不同的编译器和链接器之间相互不能通用,使得C++ 程序的二进制兼容性成了一个很大的问题...VISUAL C++ 编译器提供了一个编译选项叫函数级别链接( Functional- Level Linking,Gy),这个选项的作用就是让所有的函数都像前面模板函数一样,单独保存到一个段里面。...C++与ABI 既然每个编译器都能将源代码编译成目标文件,那么有没有不冋编译器编译出来的目标文件是不能够相互链接的呢?...所以人们一直期待着能有统一的C++ 二进制兼容标准(C++ ABI,诸多的团体和社区都在致力于 C++ ABI标准的统一。

    1.7K10

    C++中的常量与关键字

    宏定义 #define 和常量 const 的区别类型和安全检查不同宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查编译器处理不同宏定义是一个..."编译时"概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束与编译时期;const常量是一个"运行时"概念,在程序运行使用,类似于一个只读行数据存储方式不同宏定义是直接替换,不会分配内存,存储于程序的代码段中...;const常量需要进行内存分配,存储于程序的数据段中定义域不同void f1 (){ #define N 12 const int n 12;}void f2 (){ cout的宏定义失效const常量定义后将在定义域内永久有效...int n = 12; #undef N //取消宏定义后,即使在f1函数中,N也无效了 #define N 21//取消后可以重新定义}是否可以做函数参数宏定义不能作为参数传递给函数const常量可以在函数的参数列表中出现

    29630

    C++ const常量对象、常量成员函数和常引用

    — 1 — 常量对象 如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加 const 关键字。...--- — 2 — 常量成员函数 在类的成员函数后面可以加 const 关键字,则该成员函数成为常量成员函数。...这里有两个需要注意的点: 在常量成员函数中不能修改成员变量的值(静态成员变量除外); 也不能调用同类的 非 常量成员函数(静态成员函数除外)。...const Sample obj; obj.value = 100; // 出错,常量对象不可以被修改 obj.func(); // 出错,常量对象上面不能执行 非 常量成员函数...但是有个问题,对象引用作为函数的参数有一定的风险性,若函数中不小心修改了形参 o,则实参也会跟着变,这可能不是我们想要的,如何避免呢?

    1.4K20

    C++局部变量与全局变量 | 输出局部全局变量

    C++局部变量 C++局部变量是指:在一个函数内部定义的变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它,在此函数以外是不能使用这些变量的。...C++全局变量 C++全局变量:是指在函数之外定义的变量,如下: #include//头文件  using namespace std;//命名空间  int global_Variable...读者需要了解一点:如果在同一个源文件中,全局变量与局部变量 同名,则在局部变量的作用范围内,全局变量被屏 蔽,即它不起作用,设全局变量的作用是增加函数间数据联系的渠道。 ...经典案例:C++输出局部与全局变量。...C++输出局部全局变量 更多案例可以go公众号:C语言入门到精通

    1.1K2828

    C++中Const常量机制分析

    rBAoL1-Q20mAN44lAAO6uDAqdEA653.png const常量机制分析 const为C/C++常用的修饰符,表示该变量是一个常量,不可被修改等含义。...那么在实际使用中会存在如下疑问: 1,const修饰的变量是否真的不可修改? 2,如果被修改,会出现什么问题? 3,C和C++中实现机制一样吗?...3,C和C++中实现机制一样吗? 3.1不同点: 对于局部const变量,C++在变量具体使用地方通过常量替换实现。C语言中表示只读的变量。 3.2 相同点: 都不能对只读数据段的常量进行修改。...并把cpp对应生成的.o文件链接为可执行程序。 可以正常编译链接,不会报错。 会对该const变量分配空间,且被重复存储在不同只读数据段。重复次数和引用该.h文件的cpp生成的.o文件个数一致。...特别注意点: 对于头文件定义字符串指针常量的正确定义如下: const char * const constCharPtr="hello const"; 表示指针常量,则可以放在头文件。

    2.4K151

    C++编译与链接(2)-浅谈内部链接与外部链接

    ,可以参照我之前的一篇博客 C++编译与链接(1)-编译与链接过程 编译单元 首先让我们来认识一下编译单元,什么是编译单元呢?...我们知道C++中声明和定义是可以分开的 例如在vs中,我们可以一个函数声明定义放在b.cpp中,在a.cpp只需再声明一下这个函数,就可以在a.cpp中使用这个函数了 a.cpp void show()...那些编译单元(.cpp)中能向其他编译单元(.cpp)展示,提供其定义,让其他编译单元(.cpp)使用的的函数,变量就是外部链接,例如全局变量 而那些编译单元(.cpp)中不能向其他编译单元(.cpp)...答:你可能在不同的cpp中重复定义了一个具有外部链接的函数或变量,链接器在链接时找到了多个一样的函数或变量定义 为什么有时会出现无法解析的外部符号?...无法找到A::a(const int& t)的定义,就会出现无法解析的外部符号的错误 宏是内部链接还是外部链接 答:都不是,宏在预处理环节时就被替换掉了,而内部链接与外部链接是针对编译环节与链接环节而言的

    4K110

    c++常量指针和指针常量_指针指向二维数组

    ** 一:常量 ** 常量指针,指针常量,常量指针常量 a)常量定义:不可修改的值,例如250,’A’ b)const关键字功能:将变量常量化,四种形式 (1)const可以修饰普通变量,一旦修饰该变量...,该变量就当做常量看待,不可再更改 Const int a=250;//将变量a常量化 A=200;//gcc编译器报错 (2)常量指针:不能通过指针变量来修改指向的内存区域的数据,主要目的是保护数据不可篡改...;//gcc编译报错 (3)指针常量(不太用) 指针永远指向一块内存区域,不能再指向别的内存,但是可以修改指针内存的值 例如: int a=100; int * const pa=&a;//定义指针常量...*pa=300;//可以 printf("a=%d\n",*pa); int b=200; *pa=&b;//不可以,gcc报错 printf("a=%d\n",*pa); (4)常量指针常量:指针本身和指向的内容都不可修改...n",*p6); printf("%#x\n",*(int *)p3); } 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179185.html原文链接

    73620

    c++中常量表达式_定义字符串常量

    大家好,又见面了,我是你们的朋友全栈君。 C++中的const关键字可以声明运行时常量,但有的时候需要编译时常量。 例如定义数组需要的是编译时常量。...C++11通过constexp来声明常量,具有编译时常量性。...,该函数具有以下限制: 函数中只能有一条return语句 函数必须有返回值 在使用前必须定义 return返回语句表达式中不能使用非常量表达式的函数、全局数据。...如果将一个变量或成员函数标记为constexpr,则同样它是const的。但相反并不成立,一个const的变量或函数,并不是constexpr的。...发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187857.html原文链接:https://javaforall.cn

    59620
    领券