C++ 编程
sukhoi27smk
学习是为了探索这个世界的本质
展开
-
pugi UTF8
struct xml_string_writer : pugi::xml_writer { public: wofstream wfo; xml_string_writer(string file) { auto LocUtf8 = locale(locale(""), ::new codecvt_utf8<wchar_t>); wfo.open(file, ios::out); wfo.imbue(LocUtf8); } virtual v...原创 2022-04-29 16:42:05 · 452 阅读 · 0 评论 -
以字符串形式打印宏值
#define PI 3.141592654#define xstr(s) str(s)#define str(s) #sint main(){ string str1 = xstr(PI); const char* str2 = xstr(PI); cout << str1 << endl; cout << str2 << endl;}原创 2022-04-23 19:01:17 · 538 阅读 · 0 评论 -
OpenXLSX 字段读取问题
在读取excel的时候发现有些字段无法读取,通过把excel文件解压后对比发现,正常读取和不能正常读取的字段在sharedString.xml中存储的格式有差异,取其中一个字段,如下图:正常读取的不能读取的对比可以看到其区别,然后查找openxlsx对这块的处理,通过调试代码找到代码如下:const char* XLSharedStrings::getString(uint32_t index) const{ auto iter = xmlDocument().doc原创 2021-12-31 14:16:28 · 755 阅读 · 1 评论 -
C++变量未初始的后果
#include <iostream>using namespace std;void dummy(int &a){}int main(){ int i = 2; while (i--) { int a; dummy(a); if (i == 1) { a = 100; } cout << a << endl; cout << &a << endl; } getchar.原创 2021-08-26 11:48:48 · 281 阅读 · 0 评论 -
enable_if
typedef struct{ int a;}TestType;int main(){ enable_if <1, TestType>::type test1; //正确 test1.a = 100; enable_if <is_integral<int>::value, TestType>::type test2; //正确 test1.a = 100; enable_if <0, TestType>::type t.原创 2021-08-23 09:58:36 · 135 阅读 · 0 评论 -
OpenXLSX 中文字段读取问题
在读取excel的时候发现有些中文字段无法读取,通过把excel文件解压后对比发现,正常读取和不能正常读取的中文字段在sharedString.xml中存储的格式有差异,取其中一个字段,如下图:正常读取的不能读取的对比可以看到其区别,然后查找openxlsx对这块的处理,通过调试代码找到代码如下:const char* XLSharedStrings::getString(uint32_t index) const{ auto iter = xmlDocument(.原创 2021-07-29 15:33:27 · 1127 阅读 · 0 评论 -
pscp 去掉 fingerprint
wincons.c中原创 2021-06-24 17:17:19 · 161 阅读 · 0 评论 -
模板参数自动推导
class Dummy{public: template<typename PA, typename PB> void test(PA res, PB b) { }};int main(){ Dummy dummy; dummy.test(1, 2);}原创 2021-06-15 10:05:01 · 151 阅读 · 1 评论 -
to_string
to_string 会把浮点数四舍五入原创 2021-05-08 19:11:11 · 154 阅读 · 0 评论 -
可变参数模板
【导读】:C++ 可变参数模板对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以它也是C++11中最难理解和掌握的特性之一。那么请大家跟随小编,一起来学习吧。以下是正文概述在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变...转载 2020-12-15 10:15:17 · 1043 阅读 · 1 评论 -
C++ Lambda表达式基本用法
创建一个匿名函数并执行。采用的是配对的方括号[]。实例如下: 1 2 3 4 5 6 7 8 9 #include <iostream> using namespace std; int main() { []{ cout << "Hello,Worldn"; }(); } 我...转载 2020-10-12 15:48:13 · 367 阅读 · 0 评论 -
std::forward()完美转发
#include <iostream>#include <string>using namespace std;template<typename T>void print(T& t) { cout << "lvalue" << endl;}template<typename T>void print(T&& t) { cout << "rvalue" << endl;.转载 2020-10-10 19:00:58 · 449 阅读 · 0 评论 -
std::move与右值引用
#include <iostream>#include <string>using namespace std;class Test{public: Test() { m_str = new char[10]; strcpy_s(m_str, 5, "abcd"); cout << "Test Constructor" << endl; } Test(const Test& other) { m_str = n.原创 2020-10-10 17:58:59 · 144 阅读 · 0 评论 -
Boost.Python实现Python C/C++混合编程
导出函数#include<string>#include<boost/python.hpp>using namespace std;using namespace boost::python;char const * greet(){ return "hello,world";}BOOST_PYTHON_MODULE(hello_ext){ def("greet", greet);}import hello_extprint hello_转载 2020-09-28 10:26:42 · 346 阅读 · 0 评论 -
STL内嵌数据类型: value_type
使用stl库的时候一直对value_type这个东西理解的不是很好,可以说就是不理解。今天看了《STL源码剖析》才恍然大悟。这里稍作记录。每个STL中的类都有value_type这种东西,通俗的说value_type 就是stl容器盛装的数据的数据类型,例如:vector<int> vec;vector<int>::value_type x;上述两句代码,第一句是声明一个盛装数据类型是int的数据的vector,第二句是使用vector<int>::val转载 2020-09-23 09:25:25 · 724 阅读 · 0 评论 -
C++可变参数模板
可变参数模板是一个接受可变数目参数的模板函数或模板类,在模板参数列表中,typename…指出接下来的参数表示0个或多个类型的列表,一个类型名后面跟省略号表示0个或多个给定类型的非类型参数的列表。在函数参数列表中,如果一个参数的类型是一个模板参数包,则此参数也是一个函数参数包。可变参数模板通常是递归的,第一步调用处理包中的第一个实参,然后用剩余实参调用自身, sizeof…运算符可以获得包中元素数量。template <typename T>void printValue(const转载 2020-09-22 17:22:27 · 200 阅读 · 0 评论 -
rapidxml在qt linux(gcc)下写xml文件出错
在linux(gcc)下使用qt写入xml出错,代码如下:错误如图:这里写图片描述在网上找了好久没有找到答案,最后在http://stackoverflow.com/questions/14113923/rapidxml-print-header-has-undefined-methods找到了答案在rapidxml_print.hpp的第104行以后加上一些内容就好,template<class OutIt, class Ch>inline OutIt print_child转载 2020-06-23 13:52:35 · 338 阅读 · 1 评论 -
C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
一般我们进行成员变量初始化用两种方法 第一种是通过在构造函数内赋值 class Point{public:Point(){ _x = 0; _y = 0;};Point( int x, int y ){ _x = 0; _y = 0; }private:int _x, _y;}; 第二种是使用初始化列表 class Point{p转载 2012-12-22 08:59:05 · 539 阅读 · 0 评论 -
一种解决运行程序报“应用程序配置不正确”的问题
在我们开发工程中,可能有些情况下,不能在本机进行调试。这个时候我们一般会使用VM(vmware)建立一个虚拟机环境,然后把编译过的程序放在该虚拟机环境下执行调试。可是在某些情况下,不管我们编译的是debug还是release版本,在虚拟机环境中都会报“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。”(The application has failed to sta转载 2017-02-21 09:43:17 · 1086 阅读 · 0 评论 -
_MSC_VER
MS VC++ 14.0 _MSC_VER = 1900 (Visual Studio 2015)MS VC++ 12.0 _MSC_VER = 1800 (VisualStudio 2013)MS VC++ 11.0 _MSC_VER = 1700 (VisualStudio 2012)MS VC++ 10.0 _MSC_VER = 1600(VisualStudio 2转载 2017-11-16 16:39:02 · 791 阅读 · 0 评论 -
winnt.h C2146 error C2146: syntax error : missing ';' before identifier 'PVOID64'
修改winnt.h,把basetsd的中括号改成双引号原创 2018-02-25 14:40:47 · 769 阅读 · 0 评论 -
C++11中enum class的使用
枚举类型(enumeration)使我们可以将一组整型常量组织在一起。和类一样,每个枚举类型定义了一种新的类型。枚举属于字面值常量类型。C++包含两种枚举:限定作用域的和不限定作用域的。这里主要介绍限定作用域的。不限定作用域的使用可以参考: http://blog.csdn.net/fengbingchun/article/details/51778977 。C++11新标准引入了限定...转载 2018-08-18 10:56:18 · 2218 阅读 · 0 评论 -
读cpu id
#include "stdafx.h"#include <stdio.h>#include <iostream>int main(){ int buf[4]; __cpuidex(buf, 01, 0); printf("%08x %08x %08x %08x\n", buf[0], buf[1], buf[2], buf[3]); memset(bu...原创 2018-08-28 15:35:48 · 521 阅读 · 0 评论 -
sockaddr类型重定义
这时说的sockaddr类型重定义错误, 实际上包括一大堆: sockaddr, ;sockaddr_in等等.这是由于windows.h和winsock2.h包含的顺序而造成的错误: 正确的顺序是先包含winsock2.h再包含windows.h, 但好多情况下, 程序最前端往往都是#include , 所以在后面的程序中(尤其是引用别人的程序时), 就会出现这些socket相关的类型的转载 2017-02-12 12:05:25 · 4312 阅读 · 0 评论 -
C++中正确使用PRId64
nt64_t用来表示64位整数,在32位系统中是long long int,在64位系统中是long int,所以打印int64_t的格式化方法是:[cpp] view plaincopyprintf("%ld", value); // 64bit OS printf("%lld", value); // 32bit OS 当转载 2015-06-18 14:31:02 · 645 阅读 · 0 评论 -
【C++专题】static_cast, dynamic_cast, const_cast探讨
首先回顾一下C++类型转换:C++类型转换分为:隐式类型转换和显式类型转换第1部分. 隐式类型转换又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。 int ival = 3;double dval = 3.14159;iva转载 2014-03-28 09:54:58 · 580 阅读 · 0 评论 -
c/c++ 运行库
11.2 C/C++运行库11.2.1 C语言运行库任何一个C程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能够正常运行。这套代码至少包括入口函数,及其所依赖的函数所构成的函数集合。当然,它还理应包括各种标准库函数的实现。这样的一个代码集合称之为运行库(RuntimeLibrary)。而C语言的运行库,即被称为C运行库(CRT)。如果读者拥有VisualStudio,转载 2014-01-14 17:29:21 · 4515 阅读 · 0 评论 -
C/C++中“空语句”的说明
最近我的同事和一些网友都说C/C++中“空语句”(就是单独一个分号的语句)具有延时的作用,可以用来写延时代码。其实这是一种错误的理解。 首先,有人认为空语句经编译后,生成汇编代码是“NOP”指令,NOP指令是空操作指令,执行一个指令周期时间,所以认为C/C++中的“空语句”还有延时的功能,其实这是错误的,“空语句”是不会生成任何有效的指令代码的,是不具有延时做用的。 有人说如下代码转载 2012-12-22 11:11:10 · 898 阅读 · 0 评论 -
虚析构函数解析
Ø C++ 指出:当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非虚的析构函数,则结果是未定义的。运行时比较有代表性的后果是对象的派生部分不会被销毁。如果一个类要被另外一个类继承,而且用其指针指向其子类对象时,如A* d = new B();(假定A是基类,B是从A继承而来的派生类),那么其(A类)析构函数必须是虚的,否则在delete d时,B类的析构函数将不会被转载 2012-12-22 09:03:18 · 413 阅读 · 0 评论 -
关于C++ const 的全面总结
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。 一、Const作用 如下表所示:No.作用说明参考代码转载 2012-12-22 09:02:36 · 407 阅读 · 0 评论 -
C++结构体实例和类实例的初始化
结构体实例(包括共用体)和类实例的初始化方法完全相同,二者都可以应用于继承层次中。不同点是结构体(包括共用体)默认成员为public,而类默认成员是private型的。 一、若类和结构体所有数据成员均为public型,可采取如下带花括号形式进行初始化。 注意:① 不论值的个数多少,都必须使用花括号定界② 未指定值的数据成员编译器会自动初始化为默转载 2012-12-22 09:04:07 · 504 阅读 · 0 评论 -
预处理命令中的#和##
在c/c++的程序设计中,有的时候不免要实现某些对象转换出相应名字字符串或两对象名直接相连的情况,这时候可采用宏定义中加入#和##分别实现相应功能。下面是摘抄的一段解释。 The # and ## preprocessor operators are used with the #define preprocessor directive.Using # causes th转载 2012-12-23 12:51:49 · 547 阅读 · 0 评论 -
volatile的作用
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic转载 2012-12-23 12:35:49 · 408 阅读 · 0 评论 -
C++中的强制转换
标准c++中主要有四种强制转换类型运算符: const_cast,reinterpret_cast,static_cast,dynamic_cast等等。 1)static_cast(a) 将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。 表达式static_cast(a), a的值转换为模板中指定的类型T.在运行时转换过程中,不进行类型检查来确保转换的安转载 2012-12-23 12:35:40 · 474 阅读 · 0 评论 -
shared_ptr智能指针源码剖析
前几天有个人问了我一个问题: 如何将一个智能指针作为函数的返回值传递出来。当时这个问题一下子把我问倒了,后来经人提醒有一个叫shared_ptr的智能指针可以解决这个问题。将shared_ptr作为函数返回值的代码是这样的: 01#include 02#include 03转载 2014-03-20 18:51:15 · 1061 阅读 · 0 评论 -
c_str()
1.string类成员函数c_str()的原型: const char *c_str()const;//返回一个以null终止的c字符串2.c_str()函数返回一个指向正规c字符串的指针,内容和string类的本身对象是一样的,通过string类的c_str()函数能够把string对象转换成c中的字符串的样式; c_str()函数返回一个指向正转载 2014-04-18 15:50:54 · 719 阅读 · 0 评论 -
C++中的explicit关键字
在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的。了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用。既然C++语言提供这种特性转载 2014-04-18 13:59:55 · 548 阅读 · 0 评论 -
warning:deprecated conversion from string constant to 'char *'解决方案
Linux 环境下当GCC版本比较高时,编译代码可能出现的问题问题是这样产生的,先看这个函数原型:void someFunc(char *someStr);再看这个函数调用:someFunc("I'm a string!");把这两个东西组合起来,用最新的g++编译一下就会得到标题中的警告。为什么呢?原来char *背后的含义是:给我个字符串,我要修转载 2015-03-10 17:27:26 · 792 阅读 · 0 评论 -
C_C++变量命名规则
变量命名规则是为了增强代码的可读性和容易维护性。以下为C++必须遵守的变量命名规则: 1、 变量名只能是字母(A-Z,a-z)和数字(0-9)或者下划线(_)组成。2、 第一个字母必须是字母或者下划线开头。3、 不能使用C++关键字来命名变量,以免冲突。4、 变量名区分大小写。 变量命名规则:一、 用最短字符表转载 2015-03-05 09:54:07 · 536 阅读 · 0 评论 -
outside of class is not definition
有一种可能的情况:You have semicolons (;) at the end of all your function definitions making the compiler think they're declarations. 即在方法定义的后面都误添加上了";",导致编译器认为这仅仅是个声明。转载 2015-01-27 10:43:33 · 4729 阅读 · 0 评论