C/C++
土豆吞噬者
这个作者很懒,什么都没留下…
展开
-
C++中的类型转换
C++中有四种类型转换,const_cast ,static_cast,reinterpret_cast,dynamic_castC风格类型转换C风格的类型转换即强制转换最简单粗暴,管你是什么类型,直接扩号扩起来了事,缺点就是代码表达不够清晰,容易造成隐患float count = 2.0f;int totalCount = (int)count;const_cast该转换在编译...原创 2018-10-17 01:16:44 · 157 阅读 · 0 评论 -
C++作用域
C++中作用域以花括号分隔,作用域能包含彼此,作用域中声明的名字(变量,常量,类型,函数),它所嵌套的作用域也能访问定义于所有花括号之外的名字拥有全局作用域在作用域外面不能访问作用域内的名字内层作用域能重新定义外层作用域已有的名字使用::能显示访问全局变量//全局作用域int g_intValue = 100;int main(){ //局部作用域 int intVal...原创 2018-11-11 22:10:21 · 4170 阅读 · 0 评论 -
C++左值引用和右值引用
左值与右值左值是指既能出现在等号左边也能出现在等号右边的变量(或表达式),右值则只能出现在等号右边引用引用是给一个存在的对象定义的别名,一个变量可以有多个引用,引用必须初始化,引用只能在初始化的时候引用一次,不能更改引用其他变量。左值引用通过&获得左值引用,左值引用只能绑定左值。 int intValue1 = 10; //将intValue1绑定到intValue2和int...原创 2018-11-12 20:55:13 · 3157 阅读 · 2 评论 -
C++字面值
整形字面值十进制字面值的类型是int,long(32位系统中占4字节,64位系统中占8字节),long long中尺寸最小者。八进制和十六进制的字面值的类型是int,unsigned int,long,unsigned long,long long,unsigned long long中尺寸的最小者。auto value1=20;//十进制auto value2=024;//八进制aut...原创 2018-11-13 22:54:12 · 1926 阅读 · 1 评论 -
使用C++版本的C标准库头文件
对于一些拥有 xxx.h 形式的 C 标准库头文件,C++ 标准库同时包含同名的头文件和拥有形式cxxx的头文件,尽量使用C++标准库头文件代替C 标准库头文件。#include <cstdio>int main(){ printf("hello wolrd!\n"); std::printf("hello wolrd!\n"); return 0;}...原创 2018-11-14 21:31:55 · 325 阅读 · 0 评论 -
C++常量表达式和constexpr
常量表达式常量表达式是指不会改变且在编译过程中就能得到计算结果的表达式。int main(){ const int value1 = 10; const int value2 = value1 + 1; return 0;}constexprconstexpr和const很像,有如下区别使用constexpr修饰的变量将在编译期间就运算出结果,而使用const修饰的变...原创 2018-11-15 22:36:26 · 614 阅读 · 0 评论 -
C++类型处理
类型别名有两种方式可以定义类型别名typedef和using。typedef int xyint;//xyint是int的类型别名typedef int *pxyint;//pxyint是int*的类型别名using xydouble = double;//xydouble是double的类型别名using pxydouble = double*;//pxydouble是double*的...原创 2018-11-18 22:50:02 · 406 阅读 · 0 评论 -
C++范围for语句
c++11引入了一种更简单的for语句,这种for语句可以遍历容器或者其它序列的所有元素,如下代码,每次循环都会重新定义冒号左边的循环控制变量,而冒号右边必须是一个序列。int main(void){ std::vector<int> value1 = {1,2,3,4,5,6}; for (auto &n : value1) { std::cout <<...原创 2018-11-20 00:01:06 · 678 阅读 · 0 评论 -
Windows下编译zlib1.2.11
下载源代码前往zlib官网下载zlib1.2.11源代码编译汇编代码使用VS工具运行下面两个批处理zlib\contrib\masmx86\bld_ml64.batzlib\contrib\masmx64\bld_ml32.bat配置静态库项目使用VS打开解决方案文件zlib\contrib\vstudio\vc14\zlibvc.sln设置zlibstat项目编译方式(MT/M...原创 2018-11-27 15:27:04 · 2383 阅读 · 0 评论 -
Windows下编译openssl1.1.1a
下载源代码前往openssl官网下载openssl-1.1.1a.tar.gz安装ActivePrel前往ActivePrel官网下载并安装ActivePrel安装dmake命令行里输入ppm install dmake安装dmake添加zlib支持打开openssl\crypto\comp\c_zlib.c,在# include &amp;lt;zlib.h&amp;gt;上方添加#define ...原创 2018-11-27 16:03:15 · 4446 阅读 · 0 评论 -
Windows下编译libcurl7.62.0
下载源代码前往curl官网下载curl-7.62.0.zip配置项目使用VS打开解决方案curl\projects\Windows\VC15\curl-all.sln,选择一个配置例如LIB Release - LIB OpenSSL,C/C+±&amp;gt;常规-&amp;gt;附加包含目录添加zlib和openssl头文件目录,预处理命令添加HAVE_LIBZ,HAVE_ZLIB_H,ZLIB_WIN...原创 2018-11-27 16:11:33 · 424 阅读 · 0 评论 -
Windows下编译libevent2.1.8
下载源代码前往Github下载libevent2.1.8,官网的源代码不包含CMake配置。生成VS解决方案使用CMake配置libevent,填写openssl目录,生成VS解决方案完成调整event,event_core,event_extra项目编译选项后编译即可...原创 2018-11-27 16:26:55 · 680 阅读 · 0 评论 -
Window下编译boost1.68
下载boost前往boost官网下载boost1.68编译解压释放到D:\boost1.68.0,使用VS工具运行bootstrap.bat,分别运行下面两个命令,其中address-model表示编译的是32位还是64位库,–stagedir=表示输出目录,link表示编译的是静态库还是动态库,runtime-link表示使用的运行时库是静态链接还是动态链接,threading表示使用的运...原创 2018-11-27 18:12:55 · 776 阅读 · 0 评论 -
解决error C2760:语法错误: 意外的令牌“标识符”,预期的令牌为“类型说明符”
VS工具集为v141_xp时,编译会报错error C2760:语法错误: 意外的令牌“标识符”,预期的令牌为“类型说明符”解决办法:C/C++ -> 语言 -> 符合模式,修改为否...原创 2018-11-27 18:45:02 · 21594 阅读 · 0 评论 -
C++中传递可变参数
std::string & getFormattedStr(std::string &strFormatted, const char *strFormat, va_list arglist){ const int MAX_FORMATTED_STR_LEN = 2048; char strResult[MAX_FORMATTED_STR_LEN] = { 0 }; vsp...原创 2018-11-28 12:06:18 · 4154 阅读 · 0 评论 -
使用Visual Leak Detector检测内存泄漏
安装Visual Leak Detector前往官网下载并安装。设置附加包含目录添加C:\Program Files (x86)\Visual Leak Detector\include附加库目录添加C:\Program Files (x86)\Visual Leak Detector\lib\Win64附加依赖项添加vld.lib将vld.ini中的ReportTo修改为both测...原创 2018-11-28 17:50:05 · 889 阅读 · 0 评论 -
使用UMDH检测内存泄漏
设置gflag找到Image File选项卡,输入要检测的进程名,按Tab,然后勾选Create user mode stack trace database第一次转储运行要检测的的程序,命令行下运行umdh -p:进程PID -f:输出文件名(例如first.txt)。第二次转储执行你觉得可能造成内存泄漏的操作,然后再次使用umdh转储对比命令行下运行Umdh -d first.t...原创 2018-11-28 18:33:23 · 448 阅读 · 0 评论 -
多线程环境下使用openssl
使用旧版本openssl时,需要设置两个回调The documentation on OpenSSL threads states (at least for version 1.0.2):OpenSSL can safely be used in multi-threaded applications provided that at least twocallback function...原创 2018-11-29 21:28:22 · 2796 阅读 · 0 评论 -
C++函数传参时使用指针还是引用
参数为内置类型或数组时使用指针。参数可能为null时,使用指针,否则使用引用。参数作用包括输出时,使用指针,否则使用引用。原创 2018-12-03 23:42:42 · 1573 阅读 · 0 评论 -
C++友元
类可以允许其它类或者函数访问它的非公有成员,方法是另其它类或者函数成为它的友元。class Person{ //友元声明最好在类定义的开头或者结尾 friend int getPersonHeight(const Person &person); friend class Money;private: int height_; int width_;public: Pe...原创 2018-12-04 00:36:58 · 393 阅读 · 0 评论 -
jsoncpp类型检查
在使用jsoncpp解析json时,一般要做类型检查,下面是这些检查函数对各种类型的测试结果。void testJsonCpp(const std::string &document,const char *key){ Json::CharReaderBuilder builder; Json::CharReaderBuilder::strictMode(&builder....原创 2018-12-09 14:47:15 · 2525 阅读 · 1 评论 -
解决Visual Studio2017中 error C4996问题
使用boost::split时编译器报C4996错误c:\program files (x86)\microsoft visual studio\2017\enterprise\vc\tools\msvc\14.14.26428\include\xutility(2483): error C4996: ‘std::copy::_Unchecked_iterators::_Deprecate’:...原创 2018-12-09 17:27:44 · 3294 阅读 · 0 评论 -
C++十六进制字符串与数组互转
#include <cstdio>#include <string>#include <iostream>#include <sstream>#include <iomanip>#include <vector>std::string binToHex(const unsigned char *data,siz...原创 2018-12-11 02:21:08 · 5058 阅读 · 0 评论 -
微软WMI example中的BUG
微软有个C++调用WMI的example,当ExecMethod失败时,pOutParams->Release()会造成空指针访问,应当去掉。#define _WIN32_DCOM#include <iostream>using namespace std;#include <comdef.h>#include <Wbemidl.h>#pr...原创 2018-12-11 10:27:21 · 279 阅读 · 0 评论 -
统计Visual Studio代码行数
组合键:ctrl + shift + F出现查找和替换选项卡,如图所示输入b*[^:b#/]+.*$查找选项选 :正则表达式统计出整个工程的行数原创 2019-01-12 14:44:07 · 671 阅读 · 0 评论 -
定义thiscall函数指针
有时候我们需要hook thiscall函数,但是定义thiscall函数编译器会报错,这个时候可以定义fastcall函数代替thiscall,fastcall第一个参数为ecx,第二个参数为edx,其它和thiscall一样typedef PVOID (__fastcall *pfnHookedFunction)(PVOID Parameter1,PVOID Parameter2,PVOID...原创 2019-01-18 18:08:18 · 1147 阅读 · 0 评论 -
参数类型选择const char*还是const std::string&
如果该函数是作为接口给其他人使用(非源码级),那么使用const char*,比如lib或dll如果函数内部使用的是const char*,不会转换为std::string,函数调用方也是const char*,那么使用const char*其它情况都用const std::string&...原创 2019-02-22 21:03:41 · 4387 阅读 · 0 评论 -
不同编译器结果不一样的例子
下面的代码在VS2010输出为0,VS2013,VS2017输出为-1#include "stdafx.h"void testFunc(int a){ int b = (float)(a + 1) / 4294967296 - 1; printf("%d", b);}int main(){ testFunc(1); getchar(); return 0;}...原创 2019-03-04 22:39:50 · 1080 阅读 · 1 评论 -
C++11计算时间差
#include &lt;chrono&gt;auto beginTime = std::chrono::high_resolution_clock::now();auto endTime = std::chrono::high_resolution_clock::now();auto timeInterval = std::chrono::duration_cast&lt;std::chr...原创 2019-03-04 22:47:52 · 3491 阅读 · 0 评论 -
assert与NDEBUG
assertassert宏定义在头文件assert.h中,其作用是如果括号内的表达式为假,则报告错误并终止程序运行。NDEBUGNDEBUG宏定义可以影响assert的行为,当定义了NDEBUG,就屏蔽掉了assert的功能,例如VS中的Release版本就定义了该宏。#include "stdafx.h"#include <cassert>#include <cst...原创 2019-04-02 22:54:30 · 722 阅读 · 0 评论 -
C++预定义宏
__FILE__:当前程序行所在源文件名称,字符串__FUNCTION__:当前程序行所属的函数名称,字符串__LINE__:当前程序行所在源文件内的行号,整型__DATE__:当前文件的编译日期,字符串__TIME__:当前文件的编译时间,字符串#include "stdafx.h"#include <cstdio>#include <iostream>...原创 2019-04-02 23:08:07 · 253 阅读 · 0 评论 -
C++类数据成员
如果需要在const成员方法中修改一个成员变量的值,那么需要将这个成员变量修饰为mutable。即用mutable修饰的成员变量不受const成员方法的限制。class People{public: void printSelf() const; mutable int printcount_;};void People::printSelf() const{ std::cou...原创 2019-04-03 22:39:19 · 1354 阅读 · 0 评论 -
C++默认实参
某些函数中有这样一种形参,函数多次调用中都会被赋予一个相同的值,此时,我们可以在定义函数时给该形参赋予一个默认值称为函数的默认实参,调用默认实参的函数时,可以包含该实参,也可以省略该实参,省略该实参时,会使用默认实参。函数调用实参时按其位置解析,默认实参负责填补函数调用缺少的尾部实参。在设计含有默认实参的函数时,其中一项任务时合理设置形参的顺序,尽量让不怎么使用默认值的形参出现在前面,而那些经常...原创 2019-04-07 23:28:46 · 967 阅读 · 0 评论 -
C++获取重载函数的地址
重载函数是完全不同的几个函数,有不同的函数地址,当我们调用函数时,编译器根据实参确定要调用哪一个重载函数。有时候我们需要不调用函数的情况下获取某个重载函数的地址(比如将重载函数作为接口导出),该怎么做呢?除了函数调用以外,以下7种语境下也会让编译器对重载函数作出选择,我们可以通过指定函数指针类型获取重载函数地址。#include "stdafx.h"#include <cstdio&g...原创 2019-04-09 00:11:15 · 2041 阅读 · 0 评论 -
C++ lambda表达式
什么是lambda表达式lambda表达式是一个可调用的代码单元,我们可以理解为一个未命名的内联函数,当定义一个lambda时,编译器会生成一个与lambda对应的类类型。从lambda生成的类包含它所捕获的变量的数据成员,被捕获的变量在lambda创建时进行拷贝或者引用(而不是调用时)。lambda表达式格式一个lambda表达式的声明格式如下:[capture list] (para...原创 2019-04-10 00:57:38 · 165 阅读 · 0 评论 -
C++异常处理
异常的抛出在C++中,通过throw一个表达式来引发异常,被抛出的表达式的类型以及当前的调用链共同决定了哪段处理代码(handler)被用来处理异常。被选中的处理代码是在调用链中与抛出对象类型匹配的最近的处理代码。执行throw时,throw后面的语句不会再执行,转而去执行与之匹配的catch块,该catch块可能是同一个函数,也可能位于调用了发生异常的函数的另一个函数中。栈展开当thro...原创 2019-04-11 00:50:43 · 423 阅读 · 0 评论 -
C++函数重载
什么是函数重载如果同一个作用域内的几个函数名字相同但形参列表不同,我们称之为重载(overload)函数,C语言不支持重载,原因是这类函数编译后的名称是一样的,而在C++中编译后的名称会因为形参的不同而不同。判断形参类型是否不同有时候两个形参列表看起来不一样,实际上是一样的,如下代码中三个函数都是一样的:typedef std::string MYSTRING;int func(cons...原创 2019-04-11 23:34:25 · 119 阅读 · 0 评论 -
C++内联函数
内联函数的作用函数调用包含一系列工作,例如保存寄存器,并在返回时恢复,可能需要拷贝实参,程序转向一个新的位置执行等,这些工作会有一定开销,如果把函数代码在调用点上内联地展开,就可以避免这些开销,加快了程序运行速度,代价是程序体积会随着内联的次数增大。内联函数使用时要注意的内联函数应该简洁,如果语句过多,则不适合定义为内联函数,最好不要超过10行。定义在类声明之中的成员函数将自动成为内联函...原创 2019-04-13 01:42:26 · 261 阅读 · 0 评论 -
C++聚合类
聚合类(aggregate class)使用户可以直接访问其成员,并且具有特殊的初始化语法。当一个类满足以下条件时,我们说它是聚合的:所有成员都是public没有定义构造函数没有类内初始值没有基类,也没有虚函数我们可以提供一个花括号扩起来的成员初始值列表,并用它初始化聚合类的数据成员,初始值的顺序必须与生命的顺序一致,初始值列表的元素个数少于类的成员数量,则靠后的成员被值初始化。s...原创 2019-04-13 22:35:46 · 5406 阅读 · 0 评论 -
C++字面值常量类
数据成员都是字面值类型的聚合类是字面值常量类。如果一个类不是聚合类,但它符合以下要求,则它也是一个字面值常量类:数据成员都必须是字面值类型(算术类型,引用和指针,以及字面值常量类)。类必须至少含有一个constexpr构造函数。如果一个数据成员含有类内初始值,则内置类型的初始值必须是一条常量表达式。或者如果成员属性某种类类型,则初始值必须使用成员自己的constexpr构造函数。类必须使...原创 2019-04-13 23:38:29 · 757 阅读 · 0 评论