C++
C++基础
没有飘柔不洗头
彼时当年少,莫负好时光。
展开
-
C system函数打开程序时路径问题
如果路径中包含空格,直接使用system函数打开程序,会找不到程序。解决方法是使用双引号包住路径。示例如下:system("\"C:/Program files (x86)/a.exe\"");转载 2021-09-22 13:49:06 · 962 阅读 · 0 评论 -
C2252: 只能在命名空间范围内显式实例化模板
今天在搞毕设时,运行网上的一个SDK,出现如下的错误提示error C2252: 只能在命名空间范围内显式实例化模板网上查了下,是这个错误是由于vs2010全局命名空间中找不到要导出的STL类。修改很简单:将需要导出的STL类从自定义的类中移动到全局命名空间中。template class __declspec(dllexport) std::allocator<std::string>;template class __declspec(dllexport) std::vector&l转载 2021-08-04 11:32:27 · 555 阅读 · 0 评论 -
C++11新特性之十一:emplace
emplace操作是C++11新特性,新引入的的三个成员emplace_front、emplace 和 emplace_back。这些操作构造而不是拷贝元素到容器中,这些操作分别对应push_front、insert 和push_back,允许我们将元素放在容器头部、一个指定的位置和容器尾部。两者的区别当调用insert时,是将对象传递给insert,对象被拷贝到容器中,而当我们使用emplace时,是将参数传递给构造函,emplace使用这些参数在容器管理的内存空间中直接构造元素。#ifndef T转载 2021-06-23 15:51:21 · 408 阅读 · 0 评论 -
sscanf 与 sscanf_s的区别
众所周知,使用C语言读取文本,比C++的文件流快的多,而C语言格式化读取最常用、功能最强大的函数是:sscanf。关于sscanf函数的用法,有一篇文章讲解的很详细、很透彻,大家可以查看链接:https://www.jb51.net/article/90495.htm本文主要讲一下与sscanf_s的区别:在vs2010以上平台编写代码时,总是提示sscanf函数不安全,有的时候还会报错,这时候就需要使用sscanf_s函数。如果是进行格式化读取字符串的话,就可能会报错,我就遇到这个问题,耗费了大半转载 2021-03-03 10:11:05 · 885 阅读 · 1 评论 -
strstrip
strstrip函数去掉字符串的开始和结尾的制表符,空格,回车。原创 2021-03-03 09:26:50 · 565 阅读 · 0 评论 -
error LNK2019: 无法解析的外部符号 _deflate
我的环境为: Win764 + VS2005 + zlib1.2.8zlib1.2.8我使用VS2010来编译。我导入zlib库的代码如下:#include “zlib128/zlib.h”// #pragma comment(lib, “zlib128/zlibwapi.lib”) // 链接zlib动态库#pragma comment(lib, “zlib128/zlibstat.lib”) // 链接zlib静态库编译使用zlib的工程,出现错误信息如下:1>Gzip.obj :转载 2020-08-29 11:51:57 · 911 阅读 · 1 评论 -
std::nothrow分配内存不成功不抛异常
#include <iostream>int main(void){ char* p = nullptr; p = new char[0x7fffffff]; // 不捕捉异常 p = new (std::nothrow) char[0x7fffffff]; if (p == nullptr) { std::cout << "memory not enough" << std::endl; } try { p =原创 2020-08-15 22:46:55 · 116 阅读 · 0 评论 -
InterlockedCompareExchange 原子操作
unsigned longInterlockedCompareExchange( _Inout_ _Interlocked_operand_ unsigned long volatile *Destination, _In_ unsigned long Exchange, _In_ unsigned long Comperand )Destination:指向一个要被比较的值,这是一个指针。Exchange:如果Destination与Comperand相等,那么De转载 2020-08-14 14:50:23 · 460 阅读 · 0 评论 -
sizeof()与_countof()用法
sizeof() :返回所查询目标所占用字节数_countof() :返回所查询目标所含有元素个数_countof是Windows宏,用来计算一个静态分配的数组中的元素的个数,而sizeof是用来计算字节数,_countof(array)。#include <iostream>int main(int argc, char* argv[]){ const char* a = "hello world"; char sz1[] = "hello world"; char sz2[转载 2020-08-05 22:08:59 · 952 阅读 · 0 评论 -
string和wstring相互转换以及wstring显示中文问题
如果你只是使用C++来处理字符串,会用到string。不过string是窄字符串ASCII,而很多Windows API函数用的是宽字符Unicode。这样让string难以应对。作为中国的程序员,我们第一个想到的字符串就是中文,而不是英文。所以经常会遇到中文字符问题,需要经常在ASCII字符串和Unicode字符串转换。而C++的string并么有很好的去支持这么一个转换,所以还需要我们自己去写代码转换。而这个过程就是比较痛苦的。我遇到了我写一遍,你遇到了又写一遍,所以,大家总会感觉C++程序难,这里就转载 2020-07-20 08:57:14 · 3102 阅读 · 0 评论 -
/MD与/MT、/MTD与/MDD的区别
/MD使应用程序使用运行时库的多线程并特定于DLL 的版本。定义 _MT 和 _DLL,并使编译器将库名 MSVCRT.lib 放入 .obj文件中。用此选项编译的应用程序静态链接到MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在MSVCR90.DLL中,该库必须在运行时对于与MSVCRT.lib 链接的应用程序可用。当/MD与_STATIC_CPPLIB 预处理器定义(/D_STATIC_CPPLIB)一起使用时,您的应用程序将与静态多线程标准C++库 (libcpmt转载 2020-06-17 11:15:31 · 2104 阅读 · 0 评论 -
c++ inline使函数实现可以在头文件中,避免多重定义错误
谨慎使用 static:如果只是想把函数定义写在头文件中,用 inline,不要用static。static 和 inline 不一样:static 的函数是内部链接,不同编译单元可以有同名的static 函数,但该函数只对 对应的编译单元 可见。如果同一定义的 static 函数,被不同编译单元调用,每个编译单元有自己单独的一份拷贝,且此拷贝只对 对应的编译单元 可见。inline 的函数是 external linkage,如果被不同编译单元调用,每个编译单元引用/链接的是同一函数,同一定义。上转载 2020-06-14 13:08:37 · 1243 阅读 · 0 评论 -
WaitForSingleObject
在多线程的情况下,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects。这两个函数都会等待Object被标为有信号(signaled)时才返回的。那么,信号是什么呢?首先我们可以假设这里存在一个文件和两个线程,我们规定这个文件同一时刻只能被一个线程所访问打开,那么我们的线程该如何知道这个文件现在有没有被别的线程访问呢?我们可以让线程等在一个死循环里,这个循环之一在尝试打转载 2020-05-18 21:24:22 · 1694 阅读 · 0 评论 -
C++ 中 ZeroMemory、memset
使用C/C++编程时,常使用ZeroMemory、memset或 “={0}”来对结构体对象进行初始化或清零。然而这三种方式都有各自的特点,使用时需谨慎,否则容易出现严重错误,本人今日解决一个导致宕机的bug,查了几小时,才发现是由同事乱用ZeroMemory所致。于是搜集资料,撰此文以共勉。memsetvoid *memset(void *s,int ch,size_t n);是由C Run-time Library提供的提供的函数,作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清转载 2020-05-11 14:29:45 · 761 阅读 · 0 评论 -
从"read"看系统调用的耗时
1、fread和read有何不同先看两段代码:fread#include<stdio.h>#include<stdlib.h>FILE* pf = fopen("test.txt", "r");char buf[2] = { 0 };int ret = 0;do { ret = fread(buf, 1, 1, pf);} while (ret);...转载 2020-04-26 16:58:35 · 507 阅读 · 0 评论 -
std::this_thread::yield()使用理解
摘选 stackoverflow 一段:http://stackoverflow.com/questions/11048946/stdthis-threadyield-vs-stdthis-threadsleep-forstd::this_thread::yield tells the implementation to reschedule the execution of threads,...转载 2020-04-17 14:12:16 · 337 阅读 · 0 评论 -
基于最小堆实现定时器
头文件:#ifndef __PQ_TIMER__#define __PQ_TIMER__#include <functional>#include <vector>#include <windows.h>#include <unordered_map>#include <thread>typedef std::fun...原创 2020-04-16 10:15:09 · 260 阅读 · 0 评论 -
c++中的Lambda表达式
Lambda表达式C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。相较于函数指针和函数符等函数对象,Lambda有以下优点:距离:定义与使用在同一个地方,方便查看、修改和调试简洁:可以给Lambda指定名称从而多次使用效率:函数指针一般不会被内联,因为它的地址可能会被使用功能:Lambda可访问作用域内任何动态变量Lambda表...转载 2020-03-17 22:17:12 · 138 阅读 · 0 评论 -
C++ 结构体对象直接赋值
一、特点深拷贝,拷贝后的两个对象互不影响干扰二、示例#include <iostream>typedef struct _Te_Resource_Param_ //定义两个字符数组,为了验证是深拷贝还是浅拷贝{ char pcPath[256]; char pcName[256];}TeResource;int main(){ TeResource t; s...转载 2020-03-07 22:55:10 · 1926 阅读 · 0 评论 -
C语言strncasecmp()函数:比较字符串的开始n个字符
定义int strncasecmp(const char *s1, const char *s2, size_t n)描述strncasecmp()用来比较参数s1 和s2 字符串前n个字符,比较时会自动忽略大小写的差异。若参数s1 和s2 字符串相同则返回0。s1 若大于s2 则返回大于0 的值,s1 若小于s2 则返回小于0 的值。例子#include <string.h&...转载 2020-02-27 16:45:08 · 1987 阅读 · 0 评论 -
C++多字节与Unicode之间的转化
UnicodeUnicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。char数据类型C程序中使用char数据类型来定义和存储字符和字符串下面的声明定义和初始化一个包含单一字符的变量:c...转载 2020-02-26 10:44:03 · 1916 阅读 · 0 评论 -
C++调用ocx
1、保证ocx已正常注册,可以使用2、创建一个C++的命令行程序,在主程序#import “HZ_KevinTest.ocx” no_namespace生成一次程序,debug目录下就会有类似的两个文件HZ_KevinTest.tlhHZ_KevinTest.tli3.把这两个文件拷贝到源代码的位置,将第一个文件的扩展名修改为.h,调整主程序的代码,注释刚才的import语句,incl...转载 2020-02-24 10:28:58 · 1463 阅读 · 1 评论 -
子类的构造与析构原理--深入阐述虚析构函数的重要性
版权声明:本BLOG上原创文章未经本人许可,不得用于商业用途及传统媒体。网络媒体转载请注明出处...转载 2019-07-06 16:42:29 · 179 阅读 · 0 评论 -
为什么多线程读写 shared_ptr 要加锁?
为什么多线程读写 shared_ptr 要加锁?最新版下载:http://chenshuo.googlecode.com/files/CppEngineering.pdf(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 share...转载 2019-07-06 16:44:17 · 184 阅读 · 0 评论 -
左值引用和右值引用
在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。 举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(b+c)这样的操作则不会通过编译。左值一定在内存中,右值有可能在内存中也有可能在...转载 2019-08-19 10:59:41 · 86 阅读 · 0 评论 -
类型转换
//基本的向上构造#include <iostream> using ...转载 2019-08-27 16:40:00 · 121 阅读 · 0 评论 -
C++的类型转换运算符总结
C语言的类型转换比较自由,但也带来了一些问题,这些问题大多由程序员自行控制和解决。对于庞大的C++语言机制而言,这种简单粗暴的类型转换方式显然是个巨大的负担,因此C++引入4种类型转换运算符,更加严格的限制允许的类型转换,使转换过程更加规范:dynamic_cast 用于多态类型的转换static_cast 用于非多态类型的转换const_cast 用于删除cons...转载 2019-08-30 16:39:16 · 303 阅读 · 0 评论 -
boost::function 与 boost::bind 用法详解
boost::function是一个函数对象的“容器”,概念上像是C/C++中函数指针类型的泛化,是一种“智能函数指针”。它以对象的形式封装了原始的函数指针或函数对象,能够容纳任意符合函数签名的可调用对象。因此,它可以被用于回调机制,暂时保管函数或函数对象,在之后需要的时机在调用,使回调机制拥有更多的弹性。既然boost::function经常被用于回调机制,我们就先看看什么是回调函数吧.回...转载 2019-09-09 16:49:34 · 1057 阅读 · 0 评论 -
boost源码剖析之:泛型函数指针类boost::function
前奏如你所知,boost库是个特性完备,且具备工业强度的库,众多C++权威的参与使其达到了登峰造极的程度。尤其泛型的强大威力在其中被发挥得淋漓尽致,令人瞠目结舌。然而弱水三千,我们只取一瓢饮。下面,我试图从最单纯的世界开始,一步一步带领你进入源码的世界,去探究boost::function(下文简称function)内部的精微结构。通常 ,在单纯的情况下,对函数的调用简单而且直观,像这样:...转载 2019-12-14 13:47:50 · 210 阅读 · 0 评论 -
C++成员函数指针
C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回调函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。成员函数指针的声明一个成员函数指针包括成员函数的返回类型,后随::操作符类名,指针名和函数的参数。初看上去,语法有点复杂。其实可以把它理解为一个指向原函数的指针,格式是:函数返回类型,类名,:...转载 2019-10-20 22:17:00 · 358 阅读 · 0 评论 -
decltype : 从表达式的类型推断出要定义的类型
decltype : 从表达式的类型推断出要定义的类型1 函数的返回类型decltypde(func()) sum = x;2 变量的自带类型int i;decltype(i) di; // di的类型为 int3 顶层const与引用const int ci = 0, &cj = ci;decltype(ci) dci = 1; // dci的类型 const int...转载 2019-11-01 15:55:42 · 199 阅读 · 0 评论 -
解决switch……case不能匹配字符串的方法
以前写代码的时候,没有考虑到效率的问题。if……else if……else if 写了老长。如果数据量特别大的话,其实会影响到程序的效率。因为,if语句是从上到下一个个判断的,直到条件为真才退出。而switch……case 则不是从上到下进行验证的,因此效率要比if else高。可惜的是,switch case 不支持字符串,着实让我伤脑筋。今天在网上查了些资料,得到一些提示,拿出来晒晒。if...转载 2019-11-10 15:08:55 · 2971 阅读 · 0 评论 -
c++抛出异常
没有捕捉异常:捕捉了异常:原创 2019-11-21 14:08:55 · 215 阅读 · 0 评论 -
C++中的移动构造函数及move语句示例详解
这篇文章主要给大家介绍了关于C++中移动构造函数及move语句的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。前言本文主要给大家介绍了关于C++中移动构造函数及move语句的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。首先看一个小例子:#include <iostrea...转载 2019-11-21 16:18:08 · 381 阅读 · 0 评论 -
C++11中移动语义(std::move)和完美转发(std::forward)
前言所有的手段都是为了解决已存在的问题。std::move和std::forward是C++11中的特性,是为了解决C++98/C++0x中遗留的问题,虽从理解上来看比较复杂,却是较好的解决手段。左值(lvalue)与右值(rvalue)左值与右值的概念其实在C++0x中就有了。概括的讲,凡是能够取地址的可以称之为左值,反之称之为右值(一般放在寄存器),C++中并没有对左值和右值给出明确的定...转载 2019-11-22 16:55:41 · 777 阅读 · 0 评论 -
关于C中指针的引用,解引用与脱去解引用
,& 在指针操作中的意义(1)大家都知道在写int *p 时,可以声明一个指针。很少人知道在C/C++中还有一个名字就是“解引用”。他的意思就是解释引用,说的通俗一点就是,直接去寻找指针所指的地址里面的内容,此内容可以是任何数据类型,当然也可以是指针(这就是双重指针,后面将会讨论)。需要注意的是,在变量声明的时候,*不能当做解引用使用,只是表示你声明的变量是一个指针类型。exampl...转载 2019-12-14 13:35:19 · 264 阅读 · 0 评论 -
C++: 形参的*& 与 *的理解
简单理解,如下代码:int Swap1(int a, int b) { int tmp = a; a = b; b = tmp;}int Swap2(int &a, int &b) { int tmp = a; a = b; b = tmp;}Swap1中a,b的交换,形参不会改变实参的数值;Swap2中的a,b的交换,...转载 2019-12-01 21:50:03 · 454 阅读 · 0 评论 -
C++/C++11中左值、左值引用、右值、右值引用的使用
C++的表达式要不然是右值(rvalue),要不然就是左值(lvalue)。这两个名词是从C语言继承过来的,原本是为了帮助记忆:左值可以位于赋值语句的左侧,右值则不能。在C++语言中,二者的区别就没那么简单了。一个左值表达式的求值结果是一个对象或者一个函数,然而以常量对象为代表的某些左值实际上不能作为赋值语句的左侧运算对象。此外,虽然某些表达式的求值结果是对象,但它们是右值而非左值。可以做一个简...转载 2019-12-08 21:36:01 · 335 阅读 · 0 评论 -
引用折叠和完美转发
阅读本文需要具有的预备知识:1、左值和右值的基本概念2、模板推导的基本规则3、若无特殊说明,本文中的大写字母T泛指任意的数据类型引用折叠我们把引用折叠拆解为引用和折叠两个短语来解释。首先,引用的意思众所周知,当我们使用某个对象的别名的时候就好像直接使用了该对象,这也就是引用的含义。在C++11中,新加入了右值的概念。所以引用的类型就有两种形式:左值引用T&和右值引用T&...转载 2019-12-08 21:38:53 · 201 阅读 · 0 评论