C/C++
cabinriver
这个作者很懒,什么都没留下…
展开
-
解决C++调用Python可执行文件时中文乱码问题
使用ShellExecuteEx调用Python可执行文件(exe)的过程中,传递中文路径时会产生乱码的问题,主要原因为该函数传递的参数为LPCWSTR,Python中无法处理。后改用ShellExecuteExA传递LPCSTR格式的参数,Python能够正常处理其中文路径。...原创 2022-06-16 14:55:08 · 746 阅读 · 0 评论 -
QT工程release模式禁用优化、开启调试的配置方法
# QMAKE *.pro-file: release模式下禁用优化并开启调试功能## gcc#QMAKE_CXXFLAGS_RELEASE += -O0 -g#QMAKE_CFLAGS_RELEASE += -O0 -g#QMAKE_LFLAGS_RELEASE =# msvc(VS调试模式,在VS2015 + QT5.6.3环境下调试通过)QMAKE_CXXFLAGS_RELEASE += /ZiQMAKE_CXXFLAGS_RELEASE += /OdQMAKE_LFLAGS_R.原创 2021-11-15 09:49:34 · 4015 阅读 · 0 评论 -
QT pro中加入文件拷贝方法
类似VS的生成后事件,在pro文件中加入相应的拷贝命令,可在生成dll、lib文件后自动拷贝到相应的文件夹,示例如下:win32:CONFIG(release, debug | release){ #指定要拷贝的文件目录为工程目录下release目录下的所有dll、lib文件,例如工程目录在D:\QT\Test #PWD就为D:/QT/Test,DllFile = D:/QT/Test/release/*.dll TargetDll = $$PWD/release/*.dll原创 2021-08-17 14:53:44 · 3956 阅读 · 0 评论 -
重载等号(==)使用陷阱
使用重载的等号(==)操作符时,需要注意比较对象是指针还是引用,注意不要使用错误,否则将无法正确调用重载的操作符。具体使用过程如下:原创 2021-06-15 14:56:59 · 235 阅读 · 0 评论 -
C++设计模试实现--State
#include #include class CWar;class IState{public: virtual void CurrentState(CWar* pWar)=0;};class CWar{public: CWar(IState* pState) :m_state(pState),m_days(0){} ~CWar(){delete m_state;原创 2014-04-25 17:09:15 · 794 阅读 · 0 评论 -
google gtest测试框架--简单便用
1、简单调用gtest的方法/************************************************************************** * @Copyright (c) 2013, ChenMH, All rights reserved. * @file : main.cpp * @version : ver 1.0原创 2013-09-02 11:01:19 · 1112 阅读 · 0 评论 -
使用VA Snippet Editor 自动生成注释 常用宏
以下为本人在写代码时常用到的几个自动生成注释的宏。均使用VAssistX的Snippet Editor进行生成,可参考另一篇文章:【】//1、生成文件头注释/************************************************************************** * @Copyright (c) $YEAR$, ChenMH, All ri原创 2013-08-30 15:36:53 · 5509 阅读 · 0 评论 -
ShellExecute与双击结果不同
在进程A中用ShellExecute方法启动另一个进程B时,发现启动B的运行结果与双击B的运行结果不同。仔细查了一下,发现是因为把工作目录参数lpDirectory给设置成NULL了。这个参数设置成NULL之后,新启动的进程B的工作目录就会使用A的工作目录,所以会出现和双击运行结果不同的问题。把这个参数设置为进程B的工作目录后,结果就和双击一样了。 后面测试了一下CreatePr原创 2013-08-09 16:10:29 · 2128 阅读 · 0 评论 -
VC文件名后缀说明
.C:用C语言编写的源代码文件。.H、.HPP或.HXX:用C/C++语言编写的头文件,通常用来定义数据类型,声明变量、函数、结构和类。.OBJ:由编译器或汇编工具生成的目标文件,是模块的二进制中间文件。.PLG:编译信息文件,编译时的error和warning信息文件。.CPP或.CXX:用C++语言编写的源代码文件。.NCB:NCB是“No Compile Browser”原创 2013-07-04 09:07:16 · 1954 阅读 · 0 评论 -
宏参数中传入指针时的处理
/************************************************************************** * @Copyright (c) 2013, ChenMH, All rights reserved. * @file : main.cpp * @version : ver 1.0原创 2013-07-01 17:12:28 · 3708 阅读 · 0 评论 -
C++中覆盖、隐藏的区别
基本规则: 1) 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。 2) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。事例代码:/*********************************************************原创 2013-06-27 15:25:41 · 6285 阅读 · 0 评论 -
使有array[]时的一个小技巧
/************************************************************************** * @Copyright (c) 2013, ChenMH, All rights reserved. * @file : main.cpp * @version : ver 1.0 * @autho原创 2013-06-14 17:14:49 · 630 阅读 · 0 评论 -
C/C++ 打印文件名、行号、函数名的方法
今天跟踪一段开源代码的时候,因为对代码不太熟悉,所以要打印一些关键的信息。便顺手整理了一下这个能打印文件名、行号、函数名的宏。1、打印文件名、行号、函数的两种方式/************************************************************************** * @Copyright (c) 2013, ChenMH, Al...原创 2013-05-22 14:10:58 · 58464 阅读 · 4 评论 -
VC 2005 解决方案的目录结构设置和管理
Roger (roger2yi@gmail.com) 一个中等规模的解决方案通常都会包含多个项目,其中一些项目产出静态库,一些产出动态库,一些用于单元测试,还有的产出最终的应用程序执行档。除此以外,根据项目的需求,还会使用一些第三方的库。 所以为解决方案设置一转载 2011-07-05 01:03:32 · 507 阅读 · 0 评论 -
双缓冲绘图
在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃。 所谓双缓冲技术,下面是百度百科的解释: 我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层上显示图像我们才能看到。现在,我需要创建一个虚拟的、看不见但是可以在上面画图(比如说画点、线)的OSD层,我称之为offscreen(后台原创 2013-12-25 10:27:27 · 1598 阅读 · 0 评论 -
高精度计时器(微秒级)
#include #include #define TRACE_CMH printfextern "C" long long GetCurTime();extern "C" double GetTimeConsume(long long start, long long end);int main(int argc, char* argv){ for (int i=0; i<10原创 2014-09-09 14:38:23 · 6159 阅读 · 1 评论 -
QT显式加载dll的方法
1、vc生成dll的源码如下(以下源码使用vs2015编译通过):// dll头文件#ifdef SUM_EXPORTS#define SUM_API __declspec(dllexport)#else#define SUM_API __declspec(dllimport)#endifextern "C" SUM_API int fnSum(int a, int b);...原创 2018-11-30 10:13:08 · 3658 阅读 · 1 评论 -
解决QT加载dll失败问题
1、dll源码如下(使用vs2015编译):// 下列 ifdef 块是创建使从 DLL 导出更简单的// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 SUM_EXPORTS// 符号编译的。在使用此 DLL 的// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将// SUM_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定...原创 2018-11-30 10:33:24 · 9288 阅读 · 3 评论 -
isspace函数的debug版本处理中文字符时程序异常
示例代码: #include <iostream> #include <string> #include <fstream> #include <algorithm> #include <functional> #include <locale> #include &...转载 2019-01-14 17:27:29 · 544 阅读 · 0 评论 -
16进制数据与字符串互转
近期项目中用到16进制数据与字符串互转算法,但网络上搜索到的算法都有些问题,无奈自已造轮子【注:代码在VS2015环境下编译通过】【工程下载路径:https://download.csdn.net/download/cabinriver/10956952】1、头文件/*********************************************************...原创 2019-02-14 14:06:31 · 1372 阅读 · 0 评论 -
C++设计模式实现--桥模式
一、概述: 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化。那么为了应对这种“多维度的变化”(即两个以上变化的原因)的系统,可采用Bridge模式来进行设计,使系统中类的个数更少,且系统扩展更为方便。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。二、UML图: 三、优缺点: 优点:1)原创 2013-05-14 11:48:29 · 4096 阅读 · 1 评论 -
C/C++ 宏相关
1、#、##和__VA_ARGS__ 1.1#假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化(stringizing).#incldue #define PSQR(x) printf("the square o原创 2013-05-23 09:48:12 · 1172 阅读 · 0 评论 -
C语言常用宏定义
01: 防止一个头文件被重复包含#ifndef COMDEF_H#define COMDEF_H//头文件内容#endif02: 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedef unsigned char boolean; /* Boolean value type. */typedef unsi原创 2013-05-22 11:11:22 · 1019 阅读 · 0 评论 -
UML图 关系详解
UML中类图实例接口:空心圆+直线;关联:实线+箭头(企鹅需要知道气候才迁移);依赖:虚线+箭头(动物和空气的关系);聚合:空心四边形+实线+箭头(雁群和大雁的关系);合成/组合:实心四边形+实线+箭头(鸟和翅膀的关系);泛化/继承:空心三角形+实线(动物和鸟的继承关系);实现:空心三角形+虚线(实现大雁飞翔的接口);UML类图 解释UML类图(注原创 2013-04-24 16:34:42 · 1348 阅读 · 0 评论 -
C++中常用的计算两个对象的最大值的三个方法
C++中常用的计算两个对象的最大值的三个方法:1、使用宏定义:#define max(a,b) ((a) > (b) ? (a) : (b))这个语句有很多缺陷,无论什么时候你写了象这样的宏,你必须记住在写宏体时对每个参数都要加上括号;否则,别人调用你的宏时如果用了表达式就会造成很大的麻烦。但是即使你象这样做了,还会有象下面这样奇怪的事发生:int a = 5, b原创 2013-04-24 11:43:17 · 4265 阅读 · 0 评论 -
#pragma once相关
概述这是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。#pragma once是编译器相关的,就是说即使这个编译系统上有效,但在其他编译系统也不一定可以,不过现在基本上已经是每个编译器都有这个杂注了。#ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有转载 2013-04-22 11:31:16 · 516 阅读 · 0 评论 -
IT人士必去的十个网站(转载)
1、chinaunix 网址:http://www.chinaunix.net/ 简介:中国最大的linux/unix技术社区。 2、itpub 网址:http://www.itpub.net/ 简介:有名气的IT技术论坛,看看它的alexa排名就知道有多火了,尤其以数转载 2011-07-13 23:27:13 · 1016 阅读 · 0 评论 -
16进制输出 转换测试
/***********************测试************************/void TestArray(UCHAR* bData){ TRACE("\n++++++++16进制输出+++++++++\n"); for (int i=0; i原创 2011-07-10 16:37:18 · 809 阅读 · 0 评论 -
DeleteDC 与 ReleaseDC的区别
DeleteDC 与 CreateDC 对应ReleaseDC 与 GetDC 对应借过来的(GetDC),就要放还回去(ReleaseDC)自已创建的(CreateDC),要自已删除(DeleteDC)总之,要“用过之后, 不留痕迹”还有以下的特殊情况,如CClientDC dc(this)或CPaintDC dc(this);对于这样的dc到最后是否需要ReleaseDC()?答案是:不需原创 2011-07-02 23:52:35 · 2828 阅读 · 0 评论 -
共用体union用法
一、 联合说明和联合变量定义 联合也是一种新的数据类型, 它是一种特殊形式的变量。 联合说明和联合变量定义与结构十分相似原创 2011-06-28 09:25:00 · 497 阅读 · 0 评论 -
数据类型
数据类型 在Turbo C语言中, 每个变量在使用之前必须定义其数据类型。Turbo C有以 下几种类型: 整型(int)、浮点型(float)、字符型(char)、指针型(*)、无值型 (void)以及结构(struct)和联合(union)。其中前五种是Turbo C的基本数据类型 2.1 整型(int) 一、整型数说明 加上转载 2011-06-28 09:12:00 · 377 阅读 · 0 评论 -
删除容器(vector、list)中的iterator
从一个简单的问题开始,删除数组中某个元素后连续重复的元素,例如 1,1,2,3,3,1,1,1,4,0 ---> 1, 2,3,1,4,0。考虑了几秒,然后就开始动手写代码了:#include iostream>#include vector>using namespace std;int main(int argc, char* argv[]){转载 2013-04-17 14:23:36 · 2893 阅读 · 0 评论 -
函数指针与函数指针数组的基本用法
//函数指针:函数的返回值为指针类型(本质是函数)。//指针函数:指向函数的指针(本质是指针)。//数据交换int fun(int& a, int& b){ a = a+b; b = a-b; a = a-b; return 0;}int main(int argc, char **argv){ int a=5, b=6; //函数指针 int (*pFu原创 2013-05-02 17:02:47 · 666 阅读 · 0 评论 -
C++设计模式实现--原型模式
一、概述: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。可以说,拷贝是原型模式的精髓所在。举个现实中的例子来介绍原型模式。找工作的时候,我们需要准备简历。假设没有打印设备,因此需手写简历,这些简历的内容都是一样的。这样有个缺陷,如果要修改简历中的某项,那么所有已写好的简历都要修改,工作量很大。随着科技的进步,出现了打印设备。我们只需手写原创 2013-05-07 15:14:30 · 7530 阅读 · 3 评论 -
C++设计模式实现--工厂模式
一、简单工厂 概述: 简单工厂模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常根据一个条件(参数)来返回不同的类的实例。他是用来专门生产对象的类。对象的创建由工厂类来负责,而不需要类使用者处理对象的创建。 UML图: 优缺点:原创 2013-05-08 09:53:14 · 2251 阅读 · 0 评论 -
C++设计模式实现--建造者
概述: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。UML结构图: 适用于以下情况: 1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 2)当构造过程必须允许被构造的对象有不同的表示时。抽象基类: Builder基类是全部创建对象过程的抽象,提原创 2013-05-07 10:44:03 · 1157 阅读 · 0 评论 -
C++设计模式实现--观察者
概述 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,原创 2013-05-06 10:37:14 · 1041 阅读 · 0 评论 -
C++设计模式实现--单例
单例模式的使用非常广泛,其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点(同时要禁止实例的类拷贝和类赋值),该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,打印机的操作。 返回单例的类型一般有两种,分别为指针和引用,UML图如下: 代码如下://单例模式的最优实现#include //1、返回指针原创 2013-05-02 11:07:34 · 804 阅读 · 0 评论 -
C++设计模式实现--适配器
一、适配器模式特点: 适配器模式主要解决的问题就是我们要调用的接口类型,无法满足我们新系统的使用需求,这时候,我们需要将旧系统的接口,通过适配器进行转配,达到支持新接口调用的目的。对于这样的要求,我们通过适配器就可以完成,当然如果有多个接口需要转配,那么我们就需要为每一个接口提供一个适配器去完成转换的工作。具体的调用过程,我们可以进行相应的封装。达到比较通用的方式去调用适配器,原创 2013-05-03 14:23:31 · 858 阅读 · 0 评论 -
C 字符串查找函数
C/C++ string库(string.h)提供了几个字符串查找函数,如下:memchr在指定内存里定位给定字符strchr在指定字符串里定位给定字符strcspn返回在字符串str1里找到字符串str2里的任意一个字符之前已查找的字符数量strrchr在字符串里定位给定字符最后一次出现的位置strpbrk在转载 2013-05-17 11:55:35 · 1693 阅读 · 0 评论