c++
文章平均质量分 55
ComputerInBook
这个作者很懒,什么都没留下…
展开
-
C语言数组指针加1的问题
指向数组的指针存储的是连续的内存地址,而内存地址的最小编址单位是1字节,如果存储的数据本身移动几个字节,则内存地址也相应地移动几个字节。而数组指针的加1移动几个字节,取决于所指向的数组类型,这部分是由C/C++的编译器实现去处理的。下面具几个例子说明(下面的例子在MSVC的X64平台,指针本身占8个字节):1. 用C++语言测试(1) 指向1字节的数组指针:void TestPointerSize(){ char data[] = {1,2,3,4,5,6,7,8,9,10};...原创 2022-04-25 13:35:14 · 5066 阅读 · 0 评论 -
MSVC环境下X64 prolog和epilog
目录1. prolog的代码(在MASM中)2. epilog的代码(在MASM中)每一个函数需要分配栈空间、进一步调用其函数、保存非易失性寄存器、或者使用异常处理机制,都必须有一段序言代码(prolog),它的地址限制在解开数据(unwind)中描述,unwind数据与相应的函数地址条目相关。更多信息,参见X64异常处理文档。如有必要,prolog会将数据参数寄存器值保存在它的起始地址上(home address)(即,栈的最底下分出的一块地址,用于存放函数参数寄存器值和返回地址,称其为h翻译 2022-04-24 12:32:00 · 268 阅读 · 0 评论 -
MSVC平台下X64 ABI规则
本节描述X64架构(X86架构的64位扩展)的基本应用程序二进制接口(Application Binary Interface,简记为ABI)。这个主题的内容包括函数调用规则、类型分布、栈和寄存器用法、以及其它内容。1. X64调用规则概述 X64与X86之间重要的两个区别是64位的寻址能力和一套平坦的16个16位通用寄存器。给定扩展的寄存器集,X64使用 __fastcall调用规则和基于RISC(Reduced Instruction Set Computer)的异常处理模型。__fast...翻译 2022-04-23 18:09:37 · 755 阅读 · 0 评论 -
在Visual Studio C++ 项目中加入一个汇编语言源文件的方法
1.说明:Visual Studio工程系统通过使用MASM的方式支持在C++项目中使用汇编语言文件。MASM完全支持x64汇编语言源文件, 并自动将它们构建到目标文件中。然后,你可以将这些目标文件链入你为X64平台写的C++代码中。这是克服缺少x64内联汇编器的一种方法(意思就是说克服C++编译器不能直接编译.asm后缀的汇编语言源文件的方法,目前还没有内联支持直接编译汇编语言源文件)。2.具体步骤2.1 第一步:按Visual Studio向导建立C++工程,下面重点是第二步。2.2 第二步:.原创 2021-12-30 19:20:51 · 2445 阅读 · 0 评论 -
c&c++的int和long各自所占字节数
做如下测试:在windows 64 bit 平台上,使用VC分别编译成32位程序和64位程序,int和long都是占4个字节。在Linux 64 bit 平台上(测试环境为suse linux,gcc编译器),编译成64位程序,int占4字节,long占8个字节。因此,int和long到底各占多少字节,是和平台和编译器实现有关。...原创 2021-12-28 17:03:07 · 2083 阅读 · 0 评论 -
C++:使用容器存放带有指针变量的类对象时的注意事项
注意事项:使用容器存放带有指针变量的类对象时一定要重载复制构造函数。下面示例说明:定义两个类:class DataItemRegValue{public: BYTE ModBusType; short DataMark; BYTE RegisterCnt;public: DataItemRegValue(); virtual ~DataItemRegValue();};class DataItem{public: BYTE...原创 2021-09-08 17:31:21 · 726 阅读 · 1 评论 -
如何使用windbg定位c/c++代码的内存泄漏。(转)
详见以下链接的讲述:https://www.deleaker.com/blog/2021/05/30/how-to-fix-memory-leaks-in-cpp-c-using-windbg/原创 2021-08-16 17:19:16 · 314 阅读 · 0 评论 -
关于VC++调试项 Multi-threaded Debug DLL的问题。
在vc++平台下,如果编写多个工程,则每个工程对应的的以上调试项必须设置为一致,否则会出现不可预料的异常,甚至违反常理的错误,导致你摸不到调试方向,比如,wstring参数传入被调用函数,而被调用函数中打断点显示传进来却是空字符串。正确的做法是,如果在调试环境下,应将每个工程的这一项都设置成统一项,如都设置成:Multi-threaded Debug DLL。设置路径:右键工程->属性->配置属性->C++->Code Generation->Runtime Libr.原创 2021-08-10 18:12:07 · 555 阅读 · 0 评论 -
Stack cookie instrumentation code detected a stack-based buffer overrun.
在vc++下面出现这个调试错误:Stack cookie instrumentation code detected a stack-based buffer overrun.(栈检测指令检测到基于栈的缓存区被某种操作越界操作了。)原因:在栈上执行了某种操作,例如,内存复制(memcpy),内存设置(memset),缓冲区格式化(sprintf),等等,查是这个操作已经越过了申请的栈空间的大小。系统在退出函数调用时,会清理栈空音,也就是说,越过函数的结束花括号(})时,就是报以上错误。要解决以上问题原创 2021-08-10 17:54:49 · 1328 阅读 · 0 评论 -
VC++下SYSTEMTIME时间与C#下DateTime时间的相互转换
1.先说一下应用场景:有时间,需要在不同平台不同语言编写的系统之间通信,如果牵扯到时间,就需要转换一致。这儿的应用场景是,在VC++下面使用SYSTEMTIME取得的时间,需要发送到C#编写的系统解析,相反,C#使用DateTime取得的时间,也需要发送到VC++编写的程序解析。2.实现步聚,难点主要在于VC++这一端:2.1需要先将SYSTEMTIME时间转换成64位整数,返过来也需要转64位整数转抽象为SYSTEMTIME结构时间,2个方法如下:__int64 SystemTimeTo...原创 2021-03-17 18:21:52 · 759 阅读 · 0 评论 -
VC++进行64位整数网络字节序与主机字节序相互转换方法
在windows 8.1以后的版本直接就能用htonll和ntohll进行相互转换。其实此方法已实现,只是在windows 8.0及以下版本中并未开放,这里是微软件的实现方式(还有其它实现方式),经测试可用,这里将它摘出来,如下所示:#define _WS2_32_WINSOCK_SWAP_LONG(l) \ ( ( ((l) >> 24) & 0x000000FFL ) | \ ( ((...原创 2021-03-17 17:44:05 · 473 阅读 · 0 评论 -
VC++编译找不到头文件和Rebuild失败问题
1.找不到头文件题没有设置好头文件关联路径,需要将根目录和子目录都添加到附加头文件目录中,例如:根目录root,子目录sub1和sub2中有两个头文件需要在别的地方被引用,那么应该这样添头文件路径到附加包含目录中:$(SolutionDir)root$(SolutionDir)root\sub1$(SolutionDir)root\sub22.单独编译某个库能成功,但是Rebuild却提示关联的几个项目都编译失败这种是没有设置好项目引用之间的依懒关系,应该在解决方案处右键,-&g..原创 2021-03-04 18:55:47 · 913 阅读 · 1 评论 -
C&C++申请和释放二维指针
假如CmdMsg是c语言中的结构体,是c++中的类。>> c语言中申请和释放二维指针:申请二维指针示例:m_pCmdMsgList = (CmdMsg**)malloc(MaxListCnt*sizeof(CmdMsg*));for(i = 0;i<MaxListCnt;i++){ m_pCmdMsgList[i] = (CmdMsg*)malloc(sizeof(CmdMsg));}释放二维指针示例:for(i = 0;i<MaxList...原创 2020-12-30 15:58:52 · 824 阅读 · 0 评论 -
error LNK1104: cannot open file ‘Common.lib‘
VC++开发中,报类似以上找不到链接库的错误,一般是没有设置附加库输入路径,或者文件不存在,而在这里我要说的却不一样,附加库路径设置正确,而文件也存在,但是执行rebuild时总是报找不到库文件的错误,而执行build却能成功。1.现象描述:附加库设置路径正确:Additional LibraryDirectories项设置正确。输入库设置正确:Additional Dependencies项设置正确。文件位置存在这个文件,执行rebuild all总是报错:error ...原创 2020-12-24 15:37:30 · 897 阅读 · 0 评论 -
实例展示C++复制构造函数和赋值运算符函数的使用
C++的复制构造函数和赋值运算符函数究竟有什么用呢?下面通过示例来展示其用法,特虽注意几处容易忽略的地方。先定义两个数据结构:// @type UWORD | 2 byte unsigned integer. typedef unsigned short UWORD; // @type SDWORD | 4 byte signed integer. typedef signed long SDWORD;//data definition.struct Electro...原创 2020-12-12 16:57:33 · 209 阅读 · 2 评论 -
g++编译c和c++混合代码的Makefile写法
在之前的一文章里介绍了多目录Makefile的写法,但是仅针对纯c或者c++代码,但是有些时间我们需要混合编译c和c++代码,我们只需要使用g++来编译代码即可,只要我们做两点改动:第一,在引用需要c编译的头文件时,使用关关键字extern "C"括起来,例如extern "C"{ #include "avilib.h"}第二,在我们原有的Makefile文件上作少许改动,原来完整的写法见https://blog.csdn.net/ComputerInBook/article/d...原创 2020-08-26 12:55:51 · 1146 阅读 · 0 评论 -
c++调用静态函数的方法
今天在写c++程序时,发新现在的gcc和vc++对于静态函数的调用方式有所改变,在旧标准的c++中,调用类的静态方法只能用类名::函数名的方式,在新的标准中,类的对像也可以像调用类的方法一样调用静太函数。示例如下:class Date{ int y,m,d;public: Date(); static void Print();};Date::Date(){}void Date::Print(){ printf("Hello Worl...原创 2020-08-09 13:09:25 · 10357 阅读 · 1 评论 -
linux下编译出现multiple definition of 错误
这个错误从表面上看,是出现了重复定义类或函数的情况,大部分都是确实是重复定义了,但是出现这样的重复定义的原因,即是不太容易获知,我这次出现这样错误,是由于Makefile和操作不当引起的错误。 我是做了这样的操作后出现这种情况的,或许对类似的情况有所启发:1.编写Makefile文件,正常编译没有问题,编译生成了以下2个文件:client.o v4l2-camara.o2.这个时候,我把源文件改了个名称,改成了v4l2-camera.cpp,在没有make clean的情况...原创 2020-08-09 11:21:02 · 2022 阅读 · 0 评论 -
libstdc++.so.6: cannot open shared object file: No such file or directory
找不到libstdc++.so.6的原因,大致有以下几种:1.程序中没有编入路径,使用rpath指定路径,在Makefile中加入如下路径:OBJS=*.oODIR=objLDFLAGS=-Wl,-rpath=/lib$(ROOT_DIR)/$(BIN_DIR)/$(BIN):$(ROOT_DIR)/$(OBJS_DIR)/$(OBJS) $(CC) $^ -o $@ $(LDFLAGS)其中/lib为库的路径。2.由于环境变量的原因,或者是32位或者64位的兼容原因,确实...原创 2020-08-09 10:42:05 · 9911 阅读 · 1 评论 -
c++中unordered_map使用自定义类型作为键或值的问题
今天在使用自定义的枚举作为unordered_map的键时,提示以下错误:undefined reference to `std::tr1::hash<v4l2::_VideoFormat>::operator()(v4l2::_VideoFormat) const'其中_VideoFormat是我定义的枚举。在网上查了是这样说的: 首先定义模板作为unordered_map的第三个参数: struct EnumClassHash {...转载 2020-08-09 10:13:53 · 1497 阅读 · 0 评论