C/C++编程语言
文章平均质量分 65
十一月zz
leannnnnnnnnnnnnnning
展开
-
有符号数的左移和右移
对于无符号数的左移和右移,因为不涉及到符号位的问题,比较好理解:左移低位补零,高位舍弃右移高位补零,低位舍弃对于有符号数的左移和右移,因为符号位的参与,可能各个编译器的实现方式上有差别我在/home/utils/gcc-5.2.0/bin/g++ 这个g++编译器的版本上试了下:左移低位补零,高位舍弃(和无符号数的实现相同)右移高位补符号位,低位舍弃参考:C语言中无符号数和有符号数的左移和右移...原创 2022-04-30 12:12:34 · 4188 阅读 · 1 评论 -
extern inline
参考:C 语言中的冷门知识点:extern inline 函数原创 2022-04-17 21:49:05 · 429 阅读 · 0 评论 -
ImportError: /lib64/libatk-1.0.so.0: undefined symbol: g_type_check_instance_is_fundamentally_a
error log: import cv2ImportError: /lib64/libatk-1.0.so.0: undefined symbol: g_type_check_instance_is_fundamentally_a一步步来分析:为什么会报这个错误? => 这涉及到执行到import cv2, python是如何来找到cv2所在的路径的?答案是通过PYTHONPATH环境变量。其实我们pip intall库的时候,只是工具在背后帮我们把库放到了PYTHONPATH原创 2022-04-17 10:50:02 · 7211 阅读 · 0 评论 -
myfile.cpp:15:6 warning: ‘val‘ may be used uninitialized in this function [-Wmaybe-uninitialized]
本身这个问题很简单,提示也说的很清楚,val没有初始化。但是,奇怪的地方在于去查看myfile.cpp:15并没有 val 这个变量,myfile.cpp:15 指向了一个函数myfunc()的开头,这个函数里面压根并没有定义val这个变量。甚至,整个myfile.cpp里面也没有定义这个变量。解决方法:经过查找资料发现,myfile.cpp在编译的时候是加了 -O3优化选项的,经过测试发现除去把-O3删掉,问题就会消失,O3优化具体做了什么可以自行google。但问题是我就是需要-O3,那怎么办?原创 2022-03-29 17:16:56 · 5274 阅读 · 0 评论 -
undefined reference to `memcpy@GLIBC_2.14‘_清风捷影 - 博客
root cause 应该是 没有 -L -l 正确的libc.so可以通过strings 某个版本的libc.so | grep GLIBC_2.14查看当前link到的glibc的版本是否正确。原创 2022-02-24 20:40:19 · 3504 阅读 · 0 评论 -
g++: fatal error: cannot specify -o with -c, -S or -E with multiple files
如题中的错误是由于build cmdline中包含空的-I(大写的i) 导致的,如:-I /home/inc -I -I -I -imacros …/…/xxx.h原创 2022-02-23 16:58:16 · 4232 阅读 · 0 评论 -
Makefile的隐含规则
Makefile是有一些隐含规则的:参考这里默认把 *.c 编译成 *.o默认把 *.o 链接成 *看个例子:/* main.c */#include <stdio.h>int main(){ printf("helloworld\n"); return 0;}此时一个最简单的Makefile只需要下面这样就可以:main :运行make,就会生成可执行程序main.注意,Makefile里面 目标main的命名取自于main.c,必须配套才行,否原创 2021-10-14 21:19:16 · 394 阅读 · 0 评论 -
三维数组。。
三维数组的结构:参考这里指针指向三维数组:参考这里原创 2021-09-24 14:54:56 · 390 阅读 · 0 评论 -
变长数组VLA(variable length array)
暂时没有得到完整的结论,都是一些零星的解答,但是我的理解是这样的:对于分配在data段的数组(即全局变量或者static变量),是没办法支持VLA的。对于分配在栈上的数组,是可以使用VLA的。参考:GCC 中零长数组与变长数组c99-draft知乎:C语言如何定义一组长度不定的数组?下面“潇涵”的回复数组长度是“变量”,这个变量不是任意变量,而是函数参数,在调用函数是确定的参数值。如果直接用变量作数组长度这个变量必须编译期确定,不是什么变量都可以的。...原创 2021-09-14 22:00:19 · 588 阅读 · 0 评论 -
getline和cin混用的问题
cin/getline是什么?cin其实是一个istream对象(object),参考这里。getline是一个标准库函数(function),参考这里。cin/getline停止读取的标志用cin来读取键盘输入的时候,遇到 "空格、tab、回车" 停止读取。 用getline来读取键盘输入的时候,遇到 "回车" 停止读取。cin/getline读取输入流的细节当cin读取键盘输入的时候,会先判断当前读取的字符是否是 "空格,tab,回车"的一种或者几种,如果是的话,则会自动跳过,从原创 2021-08-28 13:42:35 · 1122 阅读 · 0 评论 -
error: expected primary-expression before ‘my_map‘
#include <iostream>#include <map>int main{ std::map<int, int> my_map; return 0;}error log:6:22: error: expected primary-expression before ‘my_map’6:22: error: expected ‘}’ before ‘my_map’6:22: error: expected ‘,’ or ‘;’ befo原创 2021-04-21 14:20:38 · 499 阅读 · 0 评论 -
Python Exception exceptions.NameError Installation error: gdb.execute_unwinders function is missing:
提示标题所示错误的gdb 版本:gdb-7.10.1使用的gdb的时候遇到如标题所示的错误提示信息,其实不影响正常的使用,但是一直输出这个也很烦人,网上看了下,发现有可能是当前gdb版本的bug,或者当前gdb版本安装的问题。于是换了一个gdb-9.2 版本的gdb来使用,问题消失。参考:这里...原创 2021-02-23 21:28:32 · 3705 阅读 · 0 评论 -
A CMake Demo
参考这里:CMake入门——简单CMakeLists的编写1. CMake简介CMake是一种跨平台的开源项目管理工具,所做的事其实就是告诉编译器如何去编译链接源代码。与之相似的是直接编写makefile文件,但makefile最大的缺点就是不能跨平台,一旦更换环境就要重新编写,于是我们可以使用CMake编写CMakeLists文件来解决此问题。你可以认为CMake是通过编写CMakeLists.txt,然后运行CMake命令,来自动生成Makefile。2. CMake常用的命令#cmake最小转载 2021-01-28 20:35:39 · 628 阅读 · 0 评论 -
C++11 initializer_list以及big three构造函数的调用顺序
存在以initializer_list类型为参数的构造函数#include <iostream>using namespace std;class People {public: People(int a, int b) { cout << "People(int a, int b)" << endl; } People(initializer_list<int> ) .原创 2021-01-17 21:20:58 · 190 阅读 · 0 评论 -
C++ 前向声明(forward declaration)能做什么?
类的前向声明最主要的作用是在binary release的时候可以减少头文件的依赖。因为通常做binary release的时候,会release一个 release.h + release.so,release.h用来被用户include,那么 release.h中include的所有header file在用户的工作环境中也必须能找的到才可以。所以,release.h include的header file越少对用户也就越友好。考虑如下的两种release.h/*方法1*/#include "f原创 2021-01-11 20:34:45 · 865 阅读 · 1 评论 -
链接boost::program_options到自己的程序,解决/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21‘ not found 的问题
首先,我是在公司的服务器上面工作的,我没有root权限,公司的服务器上已经存在编译好了的boost程序,我需要做的仅仅是在写程序的时候把boost添加进来首先,main.cpp如下,我只是简单的想编译一个这个程序,然后运行起来。// Copyright Vladimir Prus 2002-2004.// Distributed under the Boost Software License, Version 1.0.// (See accompanying file LICENSE_1_0..原创 2020-10-30 11:36:36 · 593 阅读 · 0 评论 -
a simple example:自定义程序的异常(exception)行为
#include <iostream>#include <exception>using namespace std;class DivideError: public exception{public: DivideError() :exception() {} const char* what(){ return "divide 0 error!!\n" ; }};double quotion(转载 2020-09-19 19:00:37 · 132 阅读 · 0 评论 -
深入理解C++对象的构造过程(笔记)
如果我们要通过某个class_A来instance一个对象object_A,通常要include class_A所在的头文件(class_A.h)。我的问题是,include class_A.h的作用是什么?答:很自然的,也是很表面的一个问题是,如果你不include class_A.h,编译会报错,会显示class_A是一个undefined type.深层次的理解是:include class_A是给编译器提供该class的原型,编译器根据这个原型来为object_A来分配空间。也就是分配.原创 2020-08-24 15:42:15 · 815 阅读 · 0 评论 -
位图:STL中bitset的使用
1、构造函数(1)bitset ( );//空的,默认设置为0(2)bitset ( unsigned long val ); //参数可以使字符串,使用#include &amp;amp;lt;iostream&amp;amp;gt;#include &amp;amp;lt;string&amp;amp;gt;#include &amp;amp;lt;bitset&amp;amp;gt;转载 2018-05-15 10:57:29 · 338 阅读 · 0 评论 -
常用的STL查找算法
一、前言——map的查找算法上次乐鑫的笔试用到了map的查找算法,find,其原型如下所示: std::map::finditerator find (const key_type& k);const_iterator find (const key_type& k) const;即查找map容器中键值为k的对象,如果找到就返回对应的迭代器,如果没有找到就返回为迭代...转载 2018-07-05 09:32:10 · 1473 阅读 · 0 评论 -
内联函数(inline) ,提高效率?
1、先说基本原则:①当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联. ②一个较为合理的经验准则是, 不要内联超过 10 行的函数. 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用!2、内联一定会增加代码量吗?不一定!因为函数调用是需要开销的(函数调用时的参...原创 2018-06-28 16:48:19 · 8441 阅读 · 1 评论 -
C/C++的NULL和0、C++的nullptr
C的NULL在C语言中,我们使用NULL表示空指针,也就是我们可以写如下代码:int *i = NULL;foo_t *f = NULL;实际上在C语言中,NULL通常被定义为如下:#define NULL ((void *)0)也就是说NULL实际上是一个void *的指针,然后吧void *指针赋值给int *和foo_t *的指针的时候,隐式转换成相应的类型。而如果...转载 2018-07-03 17:29:07 · 573 阅读 · 0 评论 -
C++ 向上与向下类型转换(static_cast与dynamic_cast)
1、隐式转型(向上转型,即将派生类对象赋值给基类)C++允许向上转型,即将派生类的对象赋值给基类的对象是可以的,其只不过是将派生类中基类的部分直接赋给基类的对象,这称为向上转型(此处的“上”指的是基类),例如:class Base{ };class Drived : public base{ };Base* Bptr;Drive* Dptr;Bptr = Dptr; //编译正确,...原创 2018-06-26 21:28:02 · 11713 阅读 · 0 评论 -
C++函数的隐藏(遮蔽)、覆盖(override,即重写,多态的实现原理)、重载(overload)
一、关于遮蔽,我们需要注意什么?我们知道C++的虚函数是为了实现多态。对于虚函数,有以下的几点需要注意: 1、基类和派生类成员的名字一样时会造成遮蔽 2、不管函数的参数如何,只要名字一样就会造成遮蔽。换句话说,基类成员函数和派生类成员函数不会构成重载,如果派生类有同名函数,那么就会遮蔽基类中的所有同名函数,不管它们的参数是否一样。 3、即使派生类的成员(包括成员变量和成员函数)和基类中成...原创 2018-07-01 10:35:09 · 1627 阅读 · 0 评论 -
C++ B类的指针指向A类的对象,基类的指针指向派生类的对象(多态)
1、B类的指针指向A类的对象首先看这么一个例子:#include &amp;amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;amp;gt;using namespace std;class A{public: A(){ a = 1; b = 2; }private: int a; int b;};class B{public: B(){原创 2018-06-26 11:13:58 · 1945 阅读 · 0 评论 -
尾递归
1、尾调用 在计算机科学里,尾调用是指一个函数里的最后一个动作是一个函数调用的情形:即这个调用的返回值直接被当前函数返回的情形。这种情形下该调用位置为尾位置。(摘自维基百科)例如: ”’ function foo(data) { a(data); return b(data); } ”’...转载 2018-05-13 23:21:30 · 137 阅读 · 0 评论 -
STL之queue的使用
1、常用的函数接口queue 模板类的定义在头文件中。 与stack 模板类很相似,queue 模板类也需要两个模板参数,一个是元素类型,一个容器类 型,元素类型是必要的,容器类型是可选的,默认为deque 类型。 定义queue 对象的示例代码如下: queue q1; queue q2;queue 的基本操作有:入队,如例:q.push(x); 将x 接到队列的末端。...原创 2018-06-18 16:33:08 · 565 阅读 · 0 评论 -
C++派生类的构造函数(构造函数的执行顺序)
1、单继承时,派生类构造函数总是先调用基类构造函数再执行其他代码1.1 派生类调用基类的构造函数 类的构造函数不能被继承,构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。 在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量...原创 2018-06-16 16:01:55 · 19048 阅读 · 2 评论 -
函数的谓词是什么? cin的返回值是什么?
1、函数谓词所谓函数谓词,即标准库算法传递的参数, 可以指定算法的操作, 如std::sort, 默认是从小到大, 通过谓词可以修改从大到小。包含基本的5种谓词模式: 函数,函数指针,lambda表达式,函数对象,库定义的函。详细见文章:C++ - 算法(algorithm) 的 谓词(predicate) 详解 stl 中_if 后缀的函数都是需要一个谓词的, 但是stl 提供给我...原创 2018-06-12 23:32:53 · 945 阅读 · 0 评论 -
数组指针、二维数组名代表的是什么?
#include &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;using namespace std;int main(){ char a[3][2] = {{'a','b'},{'c','d'}};原创 2018-05-16 17:09:46 · 2586 阅读 · 0 评论 -
qsort函数的使用
今天在刷题时,题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。遇到了qsort函数的使用,本来感觉挺简单的,但是,让我一思考二思想,给想的有点儿复杂,但是,又没弄懂到底是怎么回事,暂时记录一下正确的做法,以后能正确的使用就行了。1、qsort...转载 2018-05-16 09:39:52 · 9551 阅读 · 0 评论 -
strcpy源码
代码思想很简单,像个智障一样看了半天,还是记录一下吧。char *strcpy(char *strDest, const char *strSrc);{ assert((strDest!=NULL) && (strSrc !=NULL)); char *address = strDest; while( (*strDest++ = *strSrc+...原创 2018-05-15 19:07:53 · 489 阅读 · 0 评论 -
C++ 的 printf格式控制输出
测试平台:gcc (Ubuntu 4.8.5-4ubuntu8~16.04.1) 4.8.5%f,默认输出六位小数(对float和double类型都是默认输出六位小数),有效数字只是前6位(包括整数部分和小数部分)%lf,默认输出六位小数(对float和double类型都是默认输出六位小数),但是通过%.16lf使其输出为16位小数,但是有效数组只是前16位(包括整数部分和小数部分)...原创 2018-07-06 11:00:11 · 4252 阅读 · 0 评论 -
memcpy使用时需要注意的地方
测试平台:codeblocks 17.12;1、注意最后一个参数是字节数;原型:void * memcpy ( void * destination, const void * source, size_t num ); 将source指向的地址处的 num 个字节 拷贝到 destination 指向的地址处。注意加黑的字,是字节。 例如: int a[10] = {0...原创 2018-07-07 19:16:13 · 24539 阅读 · 1 评论 -
c语言编译、汇编、链接、执行过程分析
1、c程序的编译过程一般为:预处理编译成汇编代码(生成 .s 文件)汇编成目标代码(生成 .o 文件)链接 (生成 .exe)2、举例分析 c编译器基本都是以c文件为单位进行编译的,也就是说当编译器在编译某个c文件的时候,编译器并不知道项目中有其他的c文件的存在。c编译器只针对当前正在编译的c文件,它并不知道还有多少个其他的c文件,也不知道这些c文件之原创 2018-01-05 22:06:11 · 1859 阅读 · 0 评论 -
构造函数,复制构造函数,赋值运算符重载函数
0、People是一个类; People p1(1, 2); //调用构造函数 People p2(2, 4); //调用构造函数1、 People p = 4; //会调用构造函数,假设构造函数的原型是:People(int a, int b = 1);#include <iostream>using namespace std;c...原创 2019-03-29 16:26:09 · 302 阅读 · 0 评论 -
C++的嵌套依赖别名(typename的用法)
看了很多遍,还是记录一下1、在模板声明时typename和class是等价的template&amp;lt;class T&amp;gt; class Widget; // uses &quot;class&quot;template&amp;lt;typename T&amp;gt; class Widget; // uses &quot;typename&quot;两原创 2019-01-04 21:20:13 · 2170 阅读 · 1 评论 -
如果一个class中包含一个vector容器,那么sizeof(class_name)的值应该怎么算?
#include &amp;lt;iostream&amp;gt;#include &amp;lt;vector&amp;gt;using namespace std;class CDocument{public: int i; vector&amp;lt;long long&amp;gt; vec;};int main(){ CDocument mydoc;原创 2018-12-18 17:41:44 · 1215 阅读 · 0 评论 -
C++类中嵌套enum(枚举)、union(联合)、struct(结构体)类型
1、枚举#include &amp;lt;iostream&amp;gt;using namespace std;class test{public: enum type{ One=2,Two, Three }; test():t(One) {} type getT() {return t;}private: type t;};int main(){ tes...原创 2018-12-22 16:58:07 · 8358 阅读 · 0 评论 -
C++11中智能指针的原理、使用、实现
#include &amp;lt;iostream&amp;gt;#include &amp;lt;memory&amp;gt;#include &amp;lt;vector&amp;gt;using namespace std;template&amp;lt;typename T&amp;gt;class SmartPointer {private: T*转载 2018-12-04 19:41:30 · 296 阅读 · 0 评论