C++ language
文章平均质量分 63
关于C++的一些学习内容
阿卡基-马
业余马拉松选手
展开
-
[C++] 匿名命名空间
匿名命名空间是C++中的一种特性,它允许你在不指定名称的情况下声明一个命名空间。这种命名空间主要用于局部作用域,例如在一个源文件的顶层,来限制符号的作用范围,从而避免全局命名空间中的命名冲突。匿名命名空间中的所有声明都自动成为该源文件的局部命名空间的一部分。这意味着,即使没有显式使用命名空间前缀,也无法从其他源文件访问匿名命名空间内的成员。因此,匿名命名空间非常适合用来隐藏那些仅限于当前源文件使用的函数、变量和类型。原创 2024-07-16 09:14:30 · 352 阅读 · 0 评论 -
在C++中,将结构体的所有成员初始化为0
进行初始化是推荐的做法,因为它既简洁又符合现代C++的最佳实践。对于需要深度初始化(如指针成员初始化为 nullptr 或复杂对象的初始化),则应考虑使用构造函数。如果没有显式定义构造函数,编译器会生成一个默认构造函数,该构造函数将所有成员值初始化。对于POD(Plain Old Data)类型,这意味着它们会被初始化为0。尽管这是C语言中的方法,但在C++中同样适用,尤其是处理包含内置类型的大结构体或数组时。直接在定义结构体变量时,使用初始化列表将所有成员初始化为0。原创 2024-04-30 15:59:28 · 969 阅读 · 0 评论 -
[C++ 多线程并发] std::async
std::async是更高层次上的异步操作,使我们不用关注线程创建内部细节,就能方便的获取异步执行状态和结果,还可以指定线程创建策略,应该用std::async替代线程的创建,让它成为我们做异步操作的首选。原创 2024-04-17 20:53:15 · 827 阅读 · 0 评论 -
poco c++ static linking problems with undefined references to symbols
My experience is that the order of linking the Poco libraries is important when statically linked. Seems important Foundation to be the last one.The order that works for me is:原创 2024-03-14 16:32:49 · 378 阅读 · 0 评论 -
main函数和启动例程
汇编程序的入口是_start,而C程序的入口是main函数。汇编和链接步骤是:as hello.s -o hello.old hello.o -o hello以前我们常用gcc main.c -o main命令编译一个程序,其实也可以分三步做,第一步生成汇编代码,第二步生成目标文件,第三步生成可执行文件:gcc -S main.cgcc -c main.sgcc main...原创 2018-08-31 11:14:46 · 2059 阅读 · 1 评论 -
【C++】使用 nlohmann 解析 json 文件
nlohmann 是德国工程师,以其名字为工程名的 nlohmann/json 项目又被成为 JSON for Modern C++。网上常见如何使用 nlohmann 生成 JSON 文件的中英文资料。但如何使用 nlohmann 解析 JSON 文件的 资料 不多,或者,不够清楚直接。其实,工程的 README.md 写得也算清楚。但是对于从未接触过 JSON 文件的新手来说,还是不太友好。此篇主要向未接触过 JSON 文件的新手介绍如何快速使用 nlohmann 解析 JSON 文件。工程引用原创 2021-06-29 10:15:32 · 4082 阅读 · 2 评论 -
c++ 拷贝构造和赋值的区别
需要注意的是,拷贝构造函数和赋值运算符有一些不同之处。拷贝构造函数生成一个新对象,而赋值运算符操作已经存在的对象。另外,通常在拷贝构造函数中直接复制成员变量的值,而在赋值运算符中需要考虑已经存在的对象的状态。在C++中,拷贝构造函数和赋值运算符都用于将一个对象的值复制给另一个对象,但它们的实现方法和用途有一些区别。赋值运算符重载函数用于将一个对象的值赋给另一个已经存在的对象。拷贝构造函数用于创建一个新对象并以另一个对象的值进行初始化。中返回一个对象时,拷贝构造函数会被调用以将返回值复制给一个新的对象。原创 2024-01-02 09:26:18 · 414 阅读 · 0 评论 -
C/C++中,char类型到底是有符号还是无符号的
需要特别说明的一点是,无论 char 类型是被当作有符号还是无符号来处理,它与 signed char 和 unsigned char 都是不同的类型——即 char 、signed cahr 和 unsigned char 是三种不同的类型。为了确保代码的可移植性,建议在处理有符号和无符号字符时,尽量避免依赖于特定的有符号或无符号性质,并始终明确指定字符的有无符号性质来避免混淆。的有无符号性质是实现定义的,也就是说它可以是有符号的,也可以是无符号的,取决于编译器的具体实现。为了具体地了解当前编译器中。原创 2023-11-17 15:19:45 · 773 阅读 · 0 评论 -
cpplint : <mutex> is an unapproved C++11 header.
原创 2022-05-10 10:18:23 · 2108 阅读 · 0 评论 -
Linux动态链接库的使用
1、前言 在实际开发过程中,各个模块之间会涉及到一些通用的功能,比如读写文件,查找、排序。为了减少代码的冗余,提高代码的质量,可以将这些通用的部分提取出来,做出公共的模块库。通过动态链接库可以实现多个模块之间共享公共的函数。之前看《程序员的自我修养》中讲到程序的链接和装入过程,这些玩意都是底层的,对于理解程序的编译过程有好处。http://www.ibm.com/developerworks...转载 2018-08-23 11:34:45 · 5343 阅读 · 0 评论 -
用静态成员函数调用非静态成员变量
今天写程序要用到一个计时器,然后需要创建一个新的线程,这个线程是CtestDLG的一个成员函数,必须定义为静态的.但是这个时候就不能去访问非静态成员变量了,这里找到一个很好的解决办法:先上代码:1.线程函数的定义:private: int Count_time; CTime C_time; bool GetQuestion(); int mark;//考试分值,五个题目,一个20分,满分100 int QS[5];//随机题库序号 int c转载 2021-10-09 13:57:26 · 695 阅读 · 0 评论 -
指针与引用的区别
指针与引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“. ”),但 是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候 使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些 对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向 任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变 量肯定指向一个对象,例如你的设计不允许原创 2021-08-30 13:33:12 · 133 阅读 · 0 评论 -
C++三种容器:list、vector和deque的区别
在写C++程序的时候会发现STL是一个不错的东西,减少了代码量,使代码的复用率大大提高,减轻了程序猿的负担。还有一个就是容器,你会发现要是自己写一个链表、队列,或者是数组的时候,既要花时间还要操心怎么去维护,里面的指针啊,内存够不够用啊,长度问题,有没有可能溢出啊等等一系列的问题等着我们去解决,还是比较头疼的。所以容器的出现解决了这一个问题,它将这些数据结构都封装成了一个类,只需要加上头文件,我们就可以轻松的应用,不用那么复杂,就连指针也被封装成了迭代器,用起来更方便,更人性化,方便了我们的编程,对于程序员转载 2020-08-10 09:29:26 · 1163 阅读 · 0 评论 -
详解文件操作(ifstream、ofstream、fstream)
C++ 通过以下几个类支持文件的输入输出:ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifstream: 读操作(输入)的文件类(由istream引申而来) fstream: 可同时读写操作的文件类 (由iostream引申而来)打开文件(Open a file)对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流.原创 2021-04-07 14:33:25 · 2747 阅读 · 0 评论 -
C++11 实现简单的阻塞队列
一个blocking queue是一个支持 take 和 put 的 queue。take操作从队列中取出一个元素,如果队列为空,那么take会阻塞到直到队列中有可用元素。put操作往队列里放入一个元素,如果队列是满,那么put会阻塞到队列有可用空间。一个简单的blocking queue的实现,首先我们要有一个非常底层的容器,至于是vector还是deque甚至是list都无所谓,我们这里选择deque作为容器。前面定义的blocking queue是有界的,也就是说元素有上限,所以才会出转载 2020-09-08 10:33:57 · 740 阅读 · 0 评论 -
C++类模板(模板类)详解
人们需要编写多个形式和功能都相似的函数,因此有了函数模板来减少重复劳动;人们也需要编写多个形式和功能都相似的类,于是C++引人了类模板的概念,编译器从类模板可以自动生成多个类,避免了程序员的重复劳动。例如,在《C++运算符重载》一章中的《C++实现可变长度的动态数组》一节中,我们实现了一个可变长的整型数组类,可能还需要可变长的 double 数组类,可变长的 CStudent 数组类,等等。如果要把类似于可变长整型数组类的代码都重写一遍,无疑非常麻烦。有了类模板的机制,只需要写一个可变长的数组类模板,..转载 2020-06-19 11:29:40 · 1294 阅读 · 0 评论 -
C++拷贝构造函数详解
一. 什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a = 100;int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。#include <iostream>using namespace std;class CExample {private...转载 2020-03-31 21:39:19 · 239 阅读 · 0 评论 -
虚(virtual)析构函数
记得有一次在面试的时候被问到虚析构函数的作用,当时回答得不是很好,故现在想重新整理下。先看下下面的代码:#include<iostream>usingnamespacestd;classBase{public:Base(){cout<<"Base::constructoriscalled!"<<endl;}...原创 2020-03-10 21:32:14 · 741 阅读 · 0 评论 -
经典面试题之逆序打印单链表
题目:输入一个链表的头节点,从头到尾反过来打印每个节点的值。 思路:要打印单链表就必须遍历单链表,遍历的顺序是从头到尾,而打印的顺序是从尾到头,就是说最先遍历的节点最后打印,最后遍历的节点最先打印,就是所谓的后进先出,那么我们就可以用栈实现这种顺序,从头到尾遍历链表,每遍历一个节点将它保存到栈中,知道整个链表遍历完成,在从栈中一次取出节点并打印对应的值。 实现代码void ResverPr...转载 2018-07-09 13:44:20 · 357 阅读 · 2 评论 -
struct ifreq学习和实例
一、struct ifreq结构体 这个结构定义在/usr/include/net/if.h,用来配置和获取ip地址,掩码,MTU等接口信息的。/* Interface request structure used for socket ioctl's. All interface ioctl's must have parameter definitions which be...转载 2018-10-19 10:34:53 · 10261 阅读 · 0 评论 -
POSIX定时器--timer_create等系列
POSIX定时器最强大的定时器接口来自POSIX时钟系列,其创建、初始化以及删除一个定时器的行动被分为三个不同的函数:timer_create()(创建定时器)、timer_settime()(初始化定时器)以及timer_delete(销毁它)。创建一个定时器 int timer_create(clockid_t clock_id, struct sigevent *evp, t...转载 2018-10-17 17:35:34 · 1308 阅读 · 0 评论 -
C语言柔性数组讲解
#include<stdio.h>typedef struct _SoftArray{ int len; int array[];}SoftArray;int main(){ int len = 10; printf("The struct's size is %d\n",sizeof(SoftArray));}我们可以看出,_S...转载 2018-10-23 15:12:30 · 276 阅读 · 0 评论 -
第10章 数组和指针 - 10.3 指针和数组
下面的等式体现了C语言的灵活性:dates + 2 == &date[2] //相同的地址*(dates + 2)== dates[2] //相同的值以上关系表明了数组和指针的关系十分密切,可以使用指针表示数组的元素和获得元素的值。从本质上看,同一个对象有两种表示法。实际上,C语言标准在描述数组表示法时确实借助了指针。也就是说,定义ar[n]的...原创 2018-11-12 20:20:37 · 230 阅读 · 0 评论 -
Linux - socket 错误 Bad address
在Linux中可以用strerror(errno)去得到错误代码的字符串描述,在涉及到内存操作的时候,一不小心就strerror(errno)就返回“Bad address”的错误,当然更多的时候是Killed和Segmentation fault。何解呢?绝大多数情况肯定是内存地址已经错误了,我在工作中已经碰到了以下两种“Bad address”: 第一、文件读写: FILE...转载 2018-11-16 14:42:33 · 17017 阅读 · 0 评论 -
Gnulib - The GNU Portability Library
Introduction to GnulibGNU software has a well-deserved reputation for running on many different types of systems. While our primary goal is to write software for the GNU system, many users and devel...原创 2018-11-26 15:18:07 · 930 阅读 · 0 评论 -
./gnulib-tool --help
@ubuntu:~/work/Temp/gnulib$ ./gnulib-tool --helpUsage: gnulib-tool --list gnulib-tool --find filename gnulib-tool --import [module1 ... moduleN] gnulib-tool --add-import [module1...原创 2018-11-26 15:54:41 · 765 阅读 · 0 评论 -
__attribute__ 机制详解(一)
GNU C 的一大特色就是__attribute__ 机制。__attribute__ 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。其位置约束为: 放于声明的尾部“;” 之前__attribute__ 书写特征为: __attribute__ 前后都有两个下划线,并切后面会紧跟一对...转载 2018-11-27 09:17:19 · 4985 阅读 · 0 评论 -
gnulib -- How to add a new module
• Add the header fles and source fles to lib/.• If the module needs confgure-time checks, write an Autoconf macro for it in m4/module.m4. See m4/README for details.• Write a module description modul...原创 2018-11-27 19:11:50 · 303 阅读 · 0 评论 -
Size_t和int区别
(1)size_t和int size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。在32位架构中被普遍定义为:typedef unsigned int size_t;而在64位架构中被定义为:typedef unsigned long size_t; size_t在32位...转载 2018-11-28 09:56:02 · 10656 阅读 · 0 评论 -
c语言中rand()函数的用法笔记
最近在学着用c写一些小程序,过程中遇到很多问题,在网上查很多大神的讲解,以及查阅vs2010的帮助文档。在此做个笔记,以便今后查阅,备忘。感谢无私奉献讲解的大神们!一、rand()rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。rand()会返回一个范围在0到RAND_MAX(32767)之间...转载 2018-11-28 10:04:50 · 15486 阅读 · 2 评论 -
常量指针与指针常量的区别
三个名词虽然非常绕嘴,不过说的非常准确。用中国话的语义分析就可以很方便地把三个概念区分开。一) 常量指针。常量是形容词,指针是名词,以指针为中心的一个偏正结构短语。这样看,常量指针本质是指针,常量修饰它,表示这个指针乃是一个指向常量的指针(变量)。指针指向的对象是常量,那么这个对象不能被更改。在C/C++中,常量指针是这样声明的:1)const int *p;2)int c...转载 2018-11-28 10:34:16 · 2700 阅读 · 1 评论 -
对于Linux下system函数的深度理解
转载自:http://blog.sina.com.cn/s/blog_8043547601017qk0.html这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入 system()函数中调用的命令也都一切正常.就没理这个bug,以为是其他的代码影响到这个,或是内核驱动文件系统什么的异常导致,昨天有出现了这个 问题,...原创 2018-12-25 19:04:57 · 3044 阅读 · 1 评论 -
malloc、calloc、realloc的区别
(1)C语言跟内存分配方式<1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量、static变量.<2>在栈上创建 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限....转载 2018-10-16 14:08:48 · 557 阅读 · 0 评论 -
Ubuntu autotools的安装
autotools是个系列工具,首先确认你的Ubuntu系统是否安装了以下工具(可以通过which命令查看): aclocal autoscan autoconf autoheader automake 安装方法: root@ubuntu:~# sudo apt-get install autoconf 显示如下: ...转载 2018-09-14 11:29:24 · 2985 阅读 · 0 评论 -
linux c setitimer用法说明
在linux c编程中,setitimer是一个比较常用的函数,可用来实现延时和定时的功能,网上有各种零零散散的用法说明,都只提到了个别用法,今天抽空实践整理了一份比较详细的:使用时需要引入的头文件:#include <sys/time.h>setitimer函数原型:int setitimer(int which, const struct itimerval *new_value,...原创 2018-07-06 15:06:35 · 299 阅读 · 0 评论 -
关于Linux的应用层定时器
原文地址:点击打开链接使用定时器的目的无非是为了周期性的执行某一任务,或者是到了一个指定时间去执行某一个任务。要达到这一目的,一般有两个常见的比较有效的方法。一个是用 Linux 内部的三个定时器;另一个是用 sleep 或 usleep 函数让进程睡眠一段时间;其实,还有一个方法,那就是用 gettimeofday、difftime 等自己来计算时间间隔,然后时间到了就执行某一任务,但是这种方法...转载 2018-07-06 14:29:45 · 551 阅读 · 0 评论 -
main函数和启动例程(Startup Routine)
gcc编译文件的过程:gcc -v hello.c 可以看到完整的编译过程 使用gcc编译器编译C源程序时,gcc hello.c,会在当前目录中生成一个a.out的可执行文件。file a.out可以查看文件的类型这是一个ELF的文件,executable可执行。使用-o选项可将生成的可执行文件进行重命名。gcc -o hello hello.c 而程序编译经历了 预处理...转载 2018-07-18 17:42:00 · 1793 阅读 · 0 评论 -
【转】28-进程空间与 fork 函数原理
原文地址前面对 fork 函数牛刀小试,相信你已基本掌握了简单的“影分身术”了,不过在篇末,却为各位留下了一些坑位。为了能够说明白一些问题,本篇将讨论有关进程的一些必备知识,以及 fork 函数的底层实现。如此一来,也方便加深对其它有关问题的理解。当然,如果你对此完全不感兴趣,大可跳过。本文所讨论的范围,限制在 32 位的 linux 操作系统。1. 进程空间这里的进程空间,说的就...转载 2018-07-23 17:18:11 · 327 阅读 · 0 评论 -
memcpy引发的C常见指针问题
本博文为原创,转载请注明出处 http://blog.csdn.net/lux_veritas/article/details/8227386前段时间调bug,定位了一个字符串赋值的错误,偶然发现了一个有趣的现象,于是乎抽象出一个特定的场景,把问题扩展开来,分析了一个由memcpy函数引发的c常见指针问题和勿用,形成了本篇流水账。问题描述:main要打印一个字符串,其中调用copy_string函...转载 2018-07-03 11:17:27 · 5577 阅读 · 1 评论 -
利用strlen和sizeof求取字符串长度注意事项
原文地址:点击打开链接首先,strlen是函数,sizeof是运算操作符,二者得到的结果类型为size_t,即unsigned int类型。大部分编译程序在编译的时候就把sizeof计算过了,而strlen的结果要在运行的时候才能计算出来。对于以下语句:char *str1 = "asdfgh";char str2[] = "asdfgh";char str3[8] = {'a', 's', 'd...转载 2018-07-02 19:19:37 · 997 阅读 · 0 评论