C/C++
文章平均质量分 60
chinabinlang
webrtc,音视频编程,视频会议开发,视频直播,电子白板开发
展开
-
vs 查看 C++ #define 宏定义展开代码
右键 cpp 文件,编译 -》build 目录中会有一个 .i 文件,打开后,搜索查看的 宏定义内容,就可以看到效果;在 vs 中,选中需要查看的 cpp 文件 -》 右键属性 -》 预处理器 -》 预处理到文件 选择。如果需要调试代码,还需要将参数修改为 否;#define 通常是代码的展开;原创 2023-04-04 11:57:21 · 1362 阅读 · 0 评论 -
lambda 表达式 作为参数,作为 std::thread 参数,和 vector 链表中的变量在线程中作为消息列表的应用
lambda 表达式,之前的文章已经说命令,std::thread 也说明了;这里简答说明一下;最简单lambda 表达式:[]{};线程直接启用lambda 表达式: std::thread([]{ while(1){...} });或者 : std::thread([]{ ... });或者:auto pf = []{ ... };从上面可以看出 lambda 表达式,在处理简单逻辑线程的时候,非常方便;原创 2023-02-09 14:29:55 · 938 阅读 · 0 评论 -
Emscripten 网页js调用C++ (ffmpeg)
Emscripten 网页js调用C++原创 2022-09-05 09:48:06 · 1043 阅读 · 1 评论 -
std::future, std::async, std::promise ,std::thread
std::promise 的价值非常好,以前的 C++ 获取网络消息,需要异步线程获取,然后再通知处理;启动一个线程,不可以用 for 循环启动多个线程,这样会一个线程执行完成,在执行下一个线程;ret 的值,get()一次后,无效了;如果觉得 get()函数可能会长期阻塞函数,可以添加等待超时,非常好用;启动线程后,执行这条语句,会让线程先执行 500 毫秒后,在向后执行;这个可以在获取到 数值 前,阻塞当前线程,直到有值;//这里会阻塞当前线程,直到 g_ret 有值;//启动线程,赋值 g_ret;.原创 2022-08-09 15:25:36 · 429 阅读 · 0 评论 -
C++ 获取当前系统毫秒数
#include <chrono>#include <string>long long SysMs() { return std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::system_clock::now().time_since_epoch()).count();}原创 2021-01-11 12:02:41 · 1321 阅读 · 0 评论 -
pthread简单封装 线程退出
POSIX线程(POSIX threads):简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。Windows操作系统也有其移植版pthreads-win32;在Windows上:官方网站:http://sourceware.org/p原创 2016-03-23 12:01:32 · 1055 阅读 · 0 评论 -
C++之菱形继承
当我们谈C++时,我们谈些什么? 封装,继承,多态。这是C++语言的三大特性,而每次在谈到继承时我们不可避免的要谈到一个很重要的问题——菱形继承。a.菱形继承是什么 如上图,菱形继承即多个类继承了同一个公共基类,而这些派生类又同时被一个类继承。这么做会引发什么问题呢,让我们来看一段代码吧![cpp] view plain转载 2017-03-27 14:00:19 · 710 阅读 · 0 评论 -
C/C++语言中#的神奇作用:把宏参数字符串化/贴合宏参数
宏中"#"和"##"的用法 一、一般用法 我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.#define STR(s) #s #define CONS(a,b) int(a##e##b)printf(STR(vck)); // 输出字符串"vck" printf("%d\n", CONS(转载 2017-06-19 11:19:50 · 398 阅读 · 0 评论 -
结构对齐示例
from:https://msdn.microsoft.com/zh-cn/magazine/71kf49f1.aspx https://msdn.microsoft.com/zh-cn/magazine/83ythb65.aspx若要了解有关 Visual Studio 2017 RC 的最新文档,请参阅 Visual Studio 2017 R转载 2017-07-21 15:03:42 · 298 阅读 · 0 评论 -
C++11 lambda 表达式解析
C++ lambda 表达式网上文章很多,这几简化说明:[ ]:中括号中: from:https://www.cnblogs.com/lidabo/p/3908663.html下面是各种变量截取的选项:[] 不截取任何变量 [&} 截取外部作用域中所有变量,并作为引用在函数体中使用 [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用 [=, &f...原创 2017-08-18 18:52:27 · 460 阅读 · 0 评论 -
简单C++ log 类
class CSimpleLog{public:CSimpleLog( char * strLogFileName ){if ( strLogFileName && strlen(m_strLogFileName) ){strcpy( m_strLogFileName, strLogFileName );}m_fLog = fopen( strLogFileNam...原创 2016-04-21 19:10:55 · 1649 阅读 · 0 评论 -
C++调用Java
C++调用Java语言;这里的目的主要是了解JavaVM的创建应用,java底层技术,和C++调用Java的基本知识点;Java调用C/C++一般通过JNI技术实现,这里具体看我的别的文章;一:环境配置:win7 64 + VC2010 32 + jdk1.7.0_80 64;环境配置方法1; // 动态方法;1:VC2010新建控制台程序或者MFC程序原创 2016-05-10 17:07:44 · 4875 阅读 · 0 评论 -
C++ 虚函数表解析
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,R转载 2011-08-31 11:26:04 · 1699 阅读 · 0 评论 -
string与wstring转换
std::wstring StringToWString(const std::string &str) { std::wstring wstr(str.length(),L' '); std::copy(str.begin(), str.end(), wstr.begin()); return wstr; } //只拷贝低字节至string转载 2016-03-29 10:59:08 · 510 阅读 · 0 评论 -
VC++的Unicode编程
一、什么是Unicode先从ASCII说起,ASCII是用来表示英文字符的一种编码规范。每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数是255(00H―FFH)。其实,英文字符并没有那么多,一般只用前128个(00H―7FH,最高位为0),其中包括了控制字符、数字、大小写字母和其它一些符号。而最高位为1的另128个字符(80H―FFH)被称为“扩展ASCII”,一转载 2016-03-29 10:56:33 · 1364 阅读 · 0 评论 -
关于在MFC中添加C文件 + 关于 new 和 malloc + 静态局部变量指针
在MFC中添加C文件,一般的的流程是添加完成后,取消预编译选项,然后在C文件中按照C语言的方式编写就可以了;在C++中调用C函数,extern “C” 包含函数就可以了,或者包含C文件相关的头文件就可以了;但是今天发现了一个问题: 在C文件中通过malloc()函数创建内存空间, 在C++中,通过new创建内存空间;然后将C的内存空间memcpy到C++的内存空间;原创 2015-10-14 20:25:57 · 1945 阅读 · 0 评论 -
总结windows获取stdint.h和inttypes.h方法
stdint.h是C99的标准,主要用于统一跨平台数据定义。MSVC中不带有这个头文件,直到VS2010(新闻)。在之前的版本里面,我们可以:(1)下载这个头文件download a MS version of this header from:http://msinttypes.googlecode.com/svn/trun原创 2014-05-09 11:28:20 · 37037 阅读 · 4 评论 -
C语言实现的双向链表,C语言实现的动态链表
//#ifndef _PackageQueue_H_#define _PackageQueue_H_#ifdef __cplusplusextern "C" {#endif#define MC_INTERFACEtypedef struct _Package{ char *pcRawRtpPgk;转载 2014-08-18 14:09:38 · 905 阅读 · 0 评论 -
字符串格式化,与int转string
常用的转换:int等类型转换为string(char*):1:如果是C/C++ 格式化,通用的方法是sprintf;2:atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数;非标准C/C++库函数;3:std::to_string( int n .... )//这是函数的多个类型实现;st原创 2017-09-13 11:13:47 · 3686 阅读 · 1 评论 -
std string转wstring, UTF8转std::wstring
1 std::wstring StringToWString(const std::string &str) 2 { 3 std::wstring wstr(str.length(),L' '); 4 std::copy(str.begin(), str.end(), wstr.begin()); 5 return wstr; 6 } 7 8转载 2017-08-21 14:46:39 · 1224 阅读 · 0 评论 -
内存池
内存池是为了快速高效的内存利用,提高程序效率,降低内存开辟和删除过程,减少内存碎片,降低申请内存失败等情况;内存池一般是开辟堆上的空间;思路有两种:思路一:链表环形内存池,可以动态增减;思路二: 申请一个巨大的内存,然后分段应用;亦可根据实际增减;这里的增减可以用两种方式:(1):可以用malloc和remalloc等C语言函数实现,原创 2016-07-11 16:05:22 · 667 阅读 · 0 评论 -
左值引用,右值引用
一个技术,首先了解要干什么,然后再了解怎么干;文章很多,简单说明:int n = 10;int & n_R = n;n 是 左值;10 是右值;n_R 是 n 的引用,就是左值引用;右值:常量,函数返回的临时变量(= 之前的的数据 ),都是右值; //之前的文章,也简介了 ,return 实现了什么;可以简单认为 就是 int &&...原创 2019-09-19 15:47:50 · 329 阅读 · 0 评论 -
C++ 的 return 实现了什么 ? 汇编查看
示例一:先看一个 int 的返回;C++ 实现:int get_int(){ int nTemp = 123; return nTemp;}void CtmfcDlg::OnBnClickedButton(){ int n1 = get_int(); n1 = 0;}汇编:int get_int() //第二步;{000...原创 2019-07-26 18:14:24 · 1201 阅读 · 0 评论 -
Visual Studio 设置 C++ 标准版本
工程属性--c/c++ 所有选项--c++语言标准 iso c++17标准(/std:c++17)原创 2019-07-12 10:46:46 · 22560 阅读 · 0 评论 -
C++读取一行文本
#include <fstream>#include <vector>#include <iostream> // std::cout, std::ostream, std::hex#include <sstream> // std::stringbuf#include <string> // st...原创 2018-06-27 16:37:35 · 6939 阅读 · 0 评论 -
windows debug模式下的内存默认填充
// The following values are non-zero, constant, odd, large, and atypical.// * Non-zero values help find bugs that assume zero-filled data// * Constant values are good so that memory filling is determi...原创 2018-06-13 14:06:14 · 375 阅读 · 0 评论 -
C++ 出现异常“.... \debug_heap.cpp Line:980 Expression:__acrt_first_block==header"
通过对出现的错误:__acrt_first_block == header可以大致的知道是堆内存出现的问题,堆区一般都是用来申请分配动态数组时才会使用,而申请动态数组用的最多的就是使用关键字new[]进行申请分配。而我在程序中并未使用new,哪来的堆区的使用呢,通过查找资料了解到vector可以动态分配内存,因此问题极可能就出现在这上面。通过查阅资料了解到是vector析构异常导致的问题,可以借鉴...转载 2018-05-29 14:55:35 · 3578 阅读 · 0 评论 -
JsonCpp
官网地址:https://github.com/open-source-parsers/jsoncpp一个简单测试:void test_jsoncpp(){ std::string jsoncppstring;//写: { Json::StyledWriter writer; Json::Value jmessage; jmessage["test_strkey1"] = "value1";...原创 2018-05-07 14:01:03 · 340 阅读 · 0 评论 -
webrtc中的环形内存池ring_buffer
在之前的C++文章中,当时提到了环形内存池;在webrtc中有一个环形内存池的实现,ring_buffer;说一下实现逻辑和特点:1:很好2:用C语言实现,可以在C++中简单封装为class;3:是在堆上开辟了一块连续的内存;确定后,大小不可改变; 如果想要实现动态的内存大小变化,有两个方式: (3.1):自己添加一个实现函数;稍稍麻烦一些; 可以直接改变刚才...原创 2018-04-13 17:34:40 · 1635 阅读 · 0 评论 -
一道C++关于“栈”的问题
void test_find(){}void CMFCApplication3Dlg::OnBnClickedTest(){int nTempA = 123;MessageBox(CString(std::to_string(nTempA).c_str())); test_find();MessageBox(CString(std::to_string(nT...原创 2018-03-23 15:34:45 · 285 阅读 · 0 评论 -
std::string实现全部替换功能
voidStringReplace(string&strBase,stringstrSrc,stringstrDes) { string::size_typepos=0; string::size_typesrcLen=strSrc.size(); string::size_typedesLen=strDes.s...转载 2018-02-05 18:34:52 · 3457 阅读 · 1 评论 -
C++指针转换
之前一直用类型强制转换,现在C++添加了几个新的指针类型转换方法:需要说明的是,在类的多继承中,之前的类型强制转换是会实际地址变化的,但是指针对象语义是相等的;《Effective C++》中将c语言强制类型转换称为旧式转型,c++强制类型转换称为新式转型。 static_cast、dynamic_cast、const_cast、reinterpret_cast原创 2018-02-03 18:23:29 · 1966 阅读 · 0 评论 -
C++中的#,##,和"
本文主页链接:C++中的#,##,和"想要灵活应用宏,离不开#和##。"在学习#和##之前,先来看一个关于"的例子:[cpp] view plain copy#include #include int main() { const char* p1 = "Hell转载 2018-01-23 11:47:56 · 13559 阅读 · 3 评论 -
内存类 openh264 BufferedData DataBuffered
BufferedData.h原创 2014-11-17 14:22:24 · 884 阅读 · 0 评论 -
C++位操作符
位操作是一件比较麻烦的事情;方法1:同城就是直接用位操作符;方法2:用stl的bitset;简单了方法,但是不够强大;方法3:可以参考put_bits;方法4:从网上找一下比人简单丰封装的函数;但是没有太好的;方法5:http://michael.dipperstein.com/bitlibs/这里的封装比较好;原创 2015-06-08 14:04:08 · 1640 阅读 · 0 评论 -
C获取当前程序路径, exe路径
#include char *_getcwd( char *buffer, int maxlen );原创 2014-08-13 17:51:53 · 3291 阅读 · 0 评论 -
C++中的前置声明
超前引用(类的提前声明)出错:error C2079: 'xxx' uses undefined class '***'分类: C/C++2010-10-18 12:57 945人阅读 评论(1) 收藏 举报classc编译器错误如下: error C2079: 'xxx' uses undefined class '***'比如说,我们先定义一个b类再转载 2014-02-17 18:37:07 · 1551 阅读 · 0 评论 -
GUID转字符串 GUID格式化
void GUID2charstr(){ // GUID guid; //extern guid; char szGuid[128]={0}; _snprintf(szGuid, sizeof(szGuid), "{%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}", guid.Data1, guid.Da转载 2014-01-21 16:18:21 · 7086 阅读 · 0 评论 -
获取指针 指向的内存大小
_msizeReturns the size of a memory block allocated in the heap.RoutineRequired Header_msizesize_t _msize( void *memblock );Parametersmemblock Pointer to memory bl转载 2013-11-29 14:33:51 · 9024 阅读 · 1 评论 -
类的成员函数指针(比较深入)
文章源地址:http://blog.csdn.net/eroswang/article/details/4153356class test { public: test(){} ~test(){}void hello() { printf("hello\n"); } };void main(){test *p=new转载 2013-11-28 14:58:26 · 658 阅读 · 0 评论