C++
骑猪等风
feel it, not to think
展开
-
C++实现简单的string dictionary
C++实现简单的key value字典,可以用来代替std::map原创 2024-03-23 14:25:39 · 285 阅读 · 0 评论 -
C++实现简单的string array
C++实现简单的String Array原创 2024-03-23 14:12:36 · 243 阅读 · 0 评论 -
C++实现简单的string
C++实现简单的字符串类原创 2024-03-23 12:17:07 · 226 阅读 · 0 评论 -
C语言单井号#使用
C语言中#用于宏定义中,将符号变成对应的字符串,在编译阶段就完成了转换工作#include <stdio.h>#define printInt(x) printf("%s=%d\n", #x, x)void main(){ int age = 100; printInt(age);}上面的代码运行结果是:age=100...原创 2022-04-02 15:57:12 · 714 阅读 · 0 评论 -
C++ 11 shared_ptr 自定义析构函数
#include <iostream>#include <memory>void main(){ std::shared_ptr<int> ptr(new int(100), [](int* pInt){ std::cout << "destruct interger " << *pInt << std::endl; delete pInt;});}运行结果:原创 2022-03-23 18:19:48 · 2404 阅读 · 0 评论 -
COM的INTERFACE使用实践
INTERFACE用于声明库的接口,下面我们将实现一个简易的数学库来实践一下。我们首先声明一个接口类IMath,该类继承自IUnknown;IMath有两个方法供外部调用,分别为add和sub#undef INTERFACE#define INTERFACE IMathDECLARE_INTERFACE_(IMath, IUnknown) { STDMETHOD_(int, add)(THIS_ const int x, const int y) PURE; STDMETHOD_(i原创 2022-02-09 16:46:40 · 1267 阅读 · 0 评论 -
C++读锁重入导致死锁
读锁重入导致死锁原创 2022-01-12 14:26:23 · 1702 阅读 · 0 评论 -
C++运算符重载
#include <iostream>#include <algorithm>using namespace std;class OOT{public: explicit OOT(int v) : m(v) { } int value() const { return m; }public: inline bool operator > (const OOT& x) const { return m > x.m;.原创 2021-12-08 18:14:07 · 514 阅读 · 0 评论 -
C语言##连接符使用
## 用于连接名称,函数名、变量名等#include <iostream>using namespace std;char name_a[20] = "aaa";char name_b[20] = "bbb";char name_c[20] = "ccc";char name_d[20] = "ddd";/** * 方式一:展开成对应的变量,直接打印 */#define PRINT(n) {cout << name_##n << endl;}原创 2021-11-12 15:56:40 · 3310 阅读 · 0 评论 -
程序结束不会自动调用堆对象的析构函数
使用new申请的对象,如果不主动delete掉,在程序运行结束的时候系统释放会调用对象的析构函数呢?我们写个小程序试试#include <iostream>#include <string>class A{public: A(std::string method); ~A(); private: std::string m_method;};A::A(std::string method){ m_method = method; st原创 2021-08-04 19:45:35 · 1371 阅读 · 0 评论 -
打印errno错误描述小程序
#include <stdio.h>#include <stdlib.h>#include <string.h>int main(int argc, char* argv[]){ if (argc != 2) { printf("invalid argument. eg: ./errno 1\n"); } int e = at...原创 2020-04-05 19:19:58 · 729 阅读 · 0 评论 -
pthread_cancel pthread_testcancel测试
pthread_cancel用于取消一个线程,但被取消的线程要有取消点,才能被取消。pthread_testcancel用于设置取消点/** * Created by fangruibin * 测试取消线程操作 */#include <stdio.h>#include <pthread.h>#include <unistd.h>...原创 2019-12-31 17:14:13 · 1764 阅读 · 1 评论 -
pthread可重入锁
可重入锁是指同个线程可多次申请同把锁,而不会导致死锁,只要在初始化的时候设置锁的属性为PTHREAD_MUTEX_RECURSIVE,即可达到目的/** * Created by fangruibin * 测试死锁产生的场景 */#include <iostream>#include <pthread.h>#include <unistd.h>...原创 2019-12-31 16:15:21 · 2026 阅读 · 0 评论 -
vscode C++关闭代码声明提示
把鼠标放在函数、变量等上面,会自动弹出提示,但挡住视线,有点不习惯。打开file->preferences->settings,编辑settings.json,增加"editor.hover.enabled": false...原创 2019-12-13 14:59:38 · 1308 阅读 · 0 评论 -
函数中对没用到的参数使用(void)var
原文地址:https://stackoverflow.com/questions/21045615/what-does-voidvar-actually-do弄清楚C++中的一些细节,确实很有意思,值得回味。在C++中会看到一些函数参数没有用到,但是又不能去掉(例如继承下来的虚函数,暂时不想实现),这时候就可以在实现中(void)var,不然编译器会告警。例如:int main(...转载 2019-07-06 23:27:36 · 2048 阅读 · 0 评论 -
C++模拟产生死锁
产生死锁的条件是需要两把锁,两个线程各自持有其中的一把,在没有释放的前提下申请另一把。模拟代码如下:/** * Created by fangruibin * 测试死锁产生的场景 */#include <iostream>#include <pthread.h>#include <unistd.h>//定义两把锁pthread_mu...原创 2019-05-06 18:51:08 · 881 阅读 · 0 评论 -
queue.front()返回空元素
今天发现一个有意思的现象,当queue的元素全部pop出来了,queue.size() == 0,此时执行queue.front()不会出错,而是会返回一个空的元素。测试代码:#include <iostream>#include <queue>struct TestItem{ int a; int b; std::string c;};int...原创 2019-04-29 11:37:29 · 8638 阅读 · 2 评论 -
C++ 同类对象之间 = 赋值
#include <iostream>struct MySt{ int a; int b; MySt() { a = 0; b = 0; } void print() { std::cout << "a=" << a << std::endl << "b=" << b原创 2019-03-13 17:48:12 · 2273 阅读 · 0 评论 -
C++ 整数转字符串
#include <sstream>std::ostringstream ostr;ostr << 100;std::string str = ostr.str();原创 2019-03-21 18:39:51 · 921 阅读 · 0 评论 -
Window下使用WinPcap发Rarp包
Rarp:反向地址解析协议;在局域wangz原创 2014-11-22 12:19:55 · 1228 阅读 · 0 评论 -
Microsoft Dom xml写入与读取操作笔记
写xml函数原创 2014-11-22 11:42:15 · 790 阅读 · 0 评论 -
VC++ int64_t高低32位操作
#include "stdafx.h"#include "stdint.h"#include "windows.h"int _tmain(int argc, _TCHAR* argv[]){ int64_t iVar64; int iHigh = 1, iLow = 1; LARGE_INTEGER* lNum = (LARGE_INTEGER*)&iVar64; lNum-原创 2017-04-14 17:49:28 · 2791 阅读 · 0 评论 -
VS2010代码清理脚本
@echo off@for /r %%i in (*.aps *.idb *.ncb *.obj *.pch *.sbr *.tmp *.pdb *.bsc *.ilk *.res*.sdf *.dep *.ipch *.tlog *.exp *.hpj *.opt *.mdp *.plg *.clw) do del /f /q "%%i"@echo 清理完成!@pause>nul原创 2017-05-05 16:18:44 · 639 阅读 · 0 评论 -
Windows命名管道
服务端#include "stdafx.h"#include #define BUFSIZE 1024const static char* pszPipeName = "\\\\.\\pipe\\mynamedpipe";int _tmain(int argc, _TCHAR* argv[]){ BOOL bConnected = FALSE; BOOL bSuccess原创 2017-06-09 09:50:13 · 557 阅读 · 0 评论 -
踩了new char的坑
C++写的比较少,然而又太过自信,使用new char(2048); 想申请2048个字节的空间,结果就是调试了一整天!!特此记过!char *pc = new char('a'); //开辟一个内存单元,并用括号里的初始化char *pca = new char[15]; //开辟一个数组PS:释放内存的方法也不一样:delete pc; delete []pca;原创 2017-09-04 18:07:01 · 670 阅读 · 0 评论 -
一个简单的命令行解析类
struct USER_COMMAND{public: USER_COMMAND(CString m_strCmd) { int iIndex1 = 0, iIndex2 = 0; while(1) { iIndex2 = m_strCmd.Find(_T(' '), iIndex1); if(iIndex2 == -1) { AddCmd(m_str原创 2017-08-31 17:55:48 · 495 阅读 · 0 评论 -
字符串复制函数测试
VC下的测试结果:int _tmain(int argc, _TCHAR* argv[]){ char src[] = "1234567890"; char dst[5]; //strcpy(dst, src); //越界 //strcpy_s(dst, 5, src); //缓冲区太小,程序异常退出 //strncpy_s(dst, 5, src, 10); //缓冲区太原创 2017-09-28 16:00:02 · 330 阅读 · 0 评论 -
域名解析成IP
HOSTENT *hostent=gethostbyname(szDomain);if(hostent){ in_addr inad = *( (in_addr*) *hostent->h_addr_list); m_strIP = inet_ntoa(inad);}原创 2017-12-08 11:31:20 · 883 阅读 · 0 评论 -
MFC扩展DLL中调用Windows Media Player
在MFC应用程序中调用Windows Media Player很简单,使用CWMPPlayer4类的Create()函数直接创建就可以了。但是在MFC扩展DLL中用同样的方法,却行不通 :=( ,MS的东西就是复杂。MSDN提供的方法: https://msdn.microsoft.com/en-us/library/windows/desktop/dd563023(v=vs.85).a原创 2017-12-01 14:08:30 · 524 阅读 · 0 评论 -
简单的写日志文件函数
static int TinyLog(const char* format, ...){ FILE* fp; if(0 != fopen_s(&fp, "Test.log", "a")) { return 0; } va_list arg_ptr; va_start(arg_ptr, format); int nWrittenBytes = vfprintf(fp, form原创 2018-01-02 10:43:13 · 251 阅读 · 0 评论 -
CImage不失真缩放显示图片
dc.SetStretchBltMode(HALFTONE);m_Image.Draw(dc.GetSafeHdc(), iLeft, iTop, iWidth, iHeight);原创 2018-01-11 10:47:13 · 5892 阅读 · 0 评论 -
Windows窗口非线程安全
鉴于踩了无数次窗口线程不安全的坑,决定写一下博客,以此为戒!!项目在DLL中创建子窗口,子窗口代码中给自己SendMessage直接卡住,后面发现是在一个新开的线程中创建了子窗口,内流满面!fuck the MS转发一篇窗口消息机制的文章:http://blog.csdn.net/leonwei/article/details/8588219原创 2018-01-03 13:36:59 · 180 阅读 · 0 评论 -
C++中的 ->* 和 .* 操作符
//we have a classstruct X{ void f() {} void g() {}};typedef void (X::*pointer)();//ok, let's take a pointer and assign f to it.pointer somePointer = &X::f;//now I want to call someP...原创 2019-02-26 20:41:52 · 4111 阅读 · 0 评论 -
C++ c_str()和data()函数的区别
c_str()会在数据的末尾添加'\0'结束符,多数用于使用字符串场合;data()函数不会添加'\0'结束符原创 2019-03-09 11:39:00 · 4596 阅读 · 0 评论 -
微软XML DOM库中insertBefore()接口的用法
向xml文件中插入一个属性项,折腾了半天,终于搞明白了insertBefore的用法,还是COM的门外汉啊!函数原型是:insertBefore(IXMLDOMNode *newChild, VARIANT refChild);第一个参数是要插入的新节点,这个好理解,问题是第二个参数居然是VARIANT 类型,这让我这个对COM一无所知的孩子感到压力好大;上baidu google原创 2013-08-11 21:32:54 · 1145 阅读 · 0 评论