C/C++
文章平均质量分 91
记录工作中对linux、windows环境下使用C、C++的相关使用情况
逍遥子_
重点关注大并发处理、分布式计算、微服务、物联网、大数据等领域
展开
-
mosquitto常见问题及其解决办法
问题一:问题描述:在centos7上编译mosquitto源码时,出现以下问题:make[1]: 进入目录“/home/jason/mosquitto-1.2/man”xsltproc mosquitto.8.xmlwarning: failed to load external entity "/usr/share/xml/docbook/stylesheet/docbook...原创 2015-07-01 16:24:11 · 47817 阅读 · 4 评论 -
linux下的常用时间函数总结
1、Unix系统一直使用两种不同的时间值:“日历时间”和“进程时间”1.1、日历时间,日历时间是从国际标准时间公元1970年1月1日00:00:00到现在所经历的秒数;此时间精度为秒。 系统用time_t保存这种时间值,如果时间要求不是非常精确则可以使用此时间,例如记录文件修改的时间。 这里的time_t是个长整型数值,可以用函数:time_t time(time_t* c原创 2013-03-07 01:55:09 · 1432 阅读 · 0 评论 -
小笔记,在windows和linux下分开编译、在C\C++下都使用C风格编译
写一个既能在windows下也能在linux平台下编译的的C/C++代码:#ifdef WIN32//windows部分的代码#else//linux部分的代码#endif //WIN32C/C++接口部分的常用实现代码(导出c接口):#ifdef __cplusplus extern "C"{#endi f//__cplusplus//此处的代码无论原创 2013-03-05 14:20:36 · 1546 阅读 · 0 评论 -
<string>与<string.h>的区别
在C++开发过程中经常会遇到两个比较容易混淆的头文件引用#include 和 #include,两者的主要区别如下:#include.h>是C语言的标准库,主要是对字符串进行操作的库函数,是基于char*进行操作的,例如常见的字符串操作函数stpcpy、strcat都是在该头文件里面声明的。#include是C++语言的标准库,该库里面定义了string类,你可以包含这个头文件,然后定义一原创 2013-03-08 08:38:23 · 2540 阅读 · 2 评论 -
C++虚函数表的总结
1、 C++的多态主要是通过虚函数表来实现的:(1)编译器为每个虚基类生成一个虚函数表,但是类中只包含该虚函数表的首地址;(2)每个继承自需基类的子类都继承了虚基类的虚函数表。(3)虚函数表实际上就是一个内存块,在编译时属于代码段的一部分,该类的所有对象均共享虚函数表。 例如有如下基类struct IX{virtual void _stdcall Fx1()原创 2013-03-13 10:36:55 · 1389 阅读 · 0 评论 -
C字符串替换函数
下面的函数改写自某个前辈所写的函数:/***************************************************************************** 函数名:_ReplaceStr* 作者: * 日期: * 输入参数:char* sSrc 原字符串* char* sMatchStr 特征字符串*原创 2013-03-14 10:05:28 · 2116 阅读 · 0 评论 -
linux g++ undefined reference to `dlopen'类问题
main.cpp:(.text+0x19): undefined reference to `dlopen'main.cpp:(.text+0x22): undefined reference to `dlerror'main.cpp:(.text+0x62): undefined reference to `dlsym'需要在编译时加上-ldl。将原来的编译命令:g++ cfgf原创 2013-03-01 08:55:04 · 10466 阅读 · 0 评论 -
一个自己实现的简单的智能指针模板类
一个智能指针的小程序,使用模板函数开发,附带测试程序代码如下:///////////////////////////////////////////////auto ptrtemplateclass AutoPtr{ struct t_ptr { T* __ptr; int __counter;原创 2013-03-14 16:33:50 · 1401 阅读 · 0 评论 -
嵌入式C/C++开发过程中日志输出的一点思考
在开发过程中,需要经常输出日志以协助调试和分析问题,一个良好的日志输出能够快速的帮助我们定位和分析问题。在一些linux平台嵌入式开发过程中,开发过程中对单步调试支持的并不好,它的调试很大一部分是借助于日志来完成。对最近一段时间嵌入式开发的反思与总结,个人感觉,日志输出时尽量做到以下几点: 1、个人认为可以把日志内容分为:定位日志和错误报告日志,除此两者之外的其他调试日志内容在调试原创 2013-03-18 10:17:56 · 3247 阅读 · 0 评论 -
关于C语言可变参数函数的一些研究和总结
可变参数函数是指函数参数的个数、类型等是不固定的,需要在用户调用过程中,根据实际传入的参数来确定其类型、个数等信息。例如:可变参数函数printf可谓是在C开发过程中使用最多的标准输出库函数之一,因此有必要对其原理进行了解以便更好使用之,同时在一些开发过程中可能还需要自己来实现一个可变参数的函数。本文主要是关于C中可变参数函数的一些总结,包括可变参数的实现原理及其实现方式。 可变参数函数的原创 2013-03-19 17:29:49 · 1355 阅读 · 0 评论 -
linux环境下调试嵌入式设备时出现Aborted、segmentation fault、卡死的问题以及关于指针使用的一点想法
linux环境下调试一些嵌入式设备时出现Aborted、segmentation fault、卡死的问题,这些问题可能的原因为:1、Aborted的问题,例如:# ./logUtils0322[UnitTest.cpp]:will init log[cfgfile.cpp]: logfile open suc[LogUtils.cpp]:NOTICE OPen configu原创 2013-03-25 11:57:26 · 5169 阅读 · 0 评论 -
C++字符串操作总结
C++标准库中提供了一系列的模板类用来对字符串流的输入、输出和输入\输出操作,这些操作都是基于C++的string类,即它们都是输入、输出到一个string对象,当然它们也都提供了对应的宽字符集操作的版本。在C++开发过程中通常使用sstream对字符串进行操作,这里还存在sstream的一个兄弟版本strstream,它也可以提供类似功能的字符串操作。区别:sstream与strst原创 2013-03-29 11:31:47 · 1534 阅读 · 0 评论 -
linux下C\C++ 开发小笔记
1、linux下C的标准库中没有提供itoa、itof等,但可以使用sprintf或snprintf来代替,例如:int iNum = 123456;char tmpBuf[256];itoa(iNum, tmpBuf, 10);则可以按照如下方式使用:sprintf(tmpBuf,"%d",iNum);snprintf(tmpBuf,256,"%d",iNum原创 2013-03-25 16:17:18 · 1331 阅读 · 0 评论 -
VS系列IDE(2005、2008等)下使用cppunit的方法及使用示例
一、 准备cppunit,1、 下载并编译cppunit,这里以1.21.1为例,下载之后如图1所示为:图12、 进入cppunit-1.12.1\src编译VC\VS工程文件,可能刚开始时候没有VS的工程文件sln,此时直接打开VC的工程文件,打开后进行转换,之后就会出现VS的工程文件,如下图2所示:图23、 编译之后即会在目录cpp原创 2013-03-27 19:40:37 · 1573 阅读 · 0 评论 -
从helloworld回顾程序的编译过程之二
为简单起见,本文中的例子将不使用printf之类的标准库函数,文中只使用自己定义的函数,下面的例子中主要是在linux环境下进行验证和调试的,如果没有linux开发环境也不要紧,本文已经将在linux下调试的结果全部都复制进来了,应该不影响阅读。下面为本文中所使用的三个文件: //文件1:numOper.h int add(int iN1, int iN2); //文件原创 2013-04-18 19:49:36 · 1321 阅读 · 0 评论 -
几点关于C/C++开发的思考
最近在linux平台做了一点开发,对嵌入式开发中有这样一些总结和思考,这些思考和总结也不全是针对嵌入式开发,在平时的应用软件开发中也会遇到。其中有些点是早就有人总结了,但是自己并未深刻意识到它们的意义,在最近的开放中,遇到了与它们相关的问题,感触就相对加深了,因此也拿来总结一下。 1、尽量不要混合使用C和C++,开发过程要尽量规范统一,要用C++就全用C++要用C就全部用C。原创 2013-04-17 09:07:16 · 1073 阅读 · 0 评论 -
从helloworld回顾程序的编译过程之一
计算机中所有的文件都是以01数字形式保存的,我们常见的程序文件也是如此,以常见的入门程序Hello.c为例,其代码为代码段1所示:代码段1//hello.c#include int main(){ printf("hello, world\n");}机器中所有的字符都是用数字进行表示,可以按照ascii码表对比一下,将该Hello.c文件中每个字符用as原创 2013-04-14 11:40:12 · 1503 阅读 · 0 评论 -
linux下判断网络是否连接
本文改写自网上的一个程序,原始程序中为阻塞式调用,而且有进程创建的过程,非常不利于集成到自己程序中,因此对原始程序进行改造,使其可以完成发送一个imcp包的方式来判断网络连通,只需要调用改进后的 bool NetIsOK()函数即可,该函数返回true即表示网络状态良好,否则表示网络状态不连同,本程序中只发送了一个icmp包,在实际应用中可以根据需要改进为发送多个imcp包。修改之后的原创 2013-04-24 11:43:28 · 6668 阅读 · 1 评论 -
从helloworld回顾程序的编译过程之三——静态链接
本文关于静态链接库的链接过程分析是对《程序员的自我修养——链接、装载与库》这本书的一点学习总结,另外,本文是在linux操作系统下进行验证和测试,所使用的测试文件为:main.c和add.c,其内容如下: ---------------文件main.c--------------- //main.c int g_iMainValu原创 2013-04-19 21:46:12 · 1893 阅读 · 0 评论 -
C函数去除字符串首尾的空格、制表符,结尾的换行的函数
void TrimFB(char* pDesBuf, int iMaxLen){ if(NULL == pDesBuf) return ; int iNewStarPos =0; //find start position for(iNewStartPos=0; iNewStartPos<iMaxLen; ++iNewStartPos) { if('原创 2013-04-22 17:23:31 · 3555 阅读 · 0 评论 -
Windows平台下动态链接库的总结
1、 动态链接库与静态连接库 静态连接库与动态链接库都是经过编译器编译之后的,在计算机上可以直接运行的二进制目标文件,就像exe文件一样,但不同于exe文件的是静态链接库和动态链接库不可以独立运行,一般而言,动态链接库和动态链接是在内部实现了一些功能,对外提供了一组接口函数使得外部的程序能够通过这些对外的接口函数来使用其内部的功能。 静态链接库,是在调用该静态库的可原创 2013-06-06 09:08:45 · 3156 阅读 · 2 评论 -
函数的重载、覆盖和隐藏
从下面的这个例子中可以看到函数的重载、覆盖和隐藏的具体意思,以及它们之间的区别:#includeusing namespace std;class CParent{public:int Add(int iVal) // [P-1] {cout int Add(int iVal)]"return iVal+1;}int Add(ch原创 2013-06-07 10:35:44 · 1474 阅读 · 0 评论 -
在linux 下编译c程序时“ error:dereferencing pointer to incomplete type”的问题
在linux 下编译c程序时经常会遇到“ error:dereferencing pointer to incomplete type”的问题,该问题的原因是:结构体定义不规范造成的,回想一下,教科书中正规的结构体定义方式是:struct 结构体名{ 数据类型 成员1; ... 数据类型 成员n;};在linux中经常使用gcc进行编译c语言程序时更严格原创 2013-09-02 17:19:05 · 6215 阅读 · 0 评论 -
字符串分割函数strtok_r的用法
一、函数strtok_r的使用 函数strtok_r可以将一个字符串按照指定的分割符进行分割,例如将字符串:"hello, jason, please come here",按照","分割为:"hello""jason""please come here"也可以按照分隔符" "分割为:"hello,""jason,""please come here" 二、原创 2013-10-30 15:47:57 · 33123 阅读 · 1 评论 -
linux 内存泄露检测工具——valgrind
valgrind是linux下一个可用调试、查看内存泄露的工具,其官方网站:http://www.valgrind.org/使用时可用命令:valgrind -v --leak-check=full ./可执行程序名例如:valgrind -v --leak-check=full ./mosquitto这里mosquitto是可执行程序的名称ce原创 2013-12-06 16:49:28 · 1818 阅读 · 0 评论 -
C开源hash代码uthash的用法总结(1)
uthash 是C的比较优秀的开源代码,它实现了常见的hash操作函数,例如查找、插入、删除等待。该套开源代码采用宏的方式实现hash函数的相关功能,支持C语言的任意数据结构最为key值,甚至可以采用多个值作为key,无论是自定义的struct还是基本数据类型,需要注意的是不同类型的key其操作接口方式略有不通。 使用uthash代码时只需要包含头文件"uthash.h"即可。由于该原创 2013-11-13 10:42:52 · 27956 阅读 · 8 评论 -
一个自动在栈和堆上分配变长数组的实现方式
在开发过程中,经常会遇到想要申请的内存长度不固定的情况,在一般效率不高时,直接使用malloc或者free就可以,但是在一些效率要求较高的场合,频繁的使用malloc和free会严重影响到系统的性能,在大多数情况下,我们遇到的情况都是:申请的长度一般都在某个值之下,特殊情况下,会出现长度大于此值;这时候如果使用一个定长的数组,则可以显著提升系统效率,但是又照顾不了个别情况下数组无法装下的问题,并且原创 2013-12-20 16:04:36 · 1764 阅读 · 0 评论 -
C开源hash代码uthash的用法总结(2)
5.完整程序例子5.1.key类型为int的完整的例子#include /* gets */#include /* atoi, malloc */#include /* strcpy */#include "uthash.h"struct my_struct { int ikey; /* key */ c原创 2013-11-13 10:51:02 · 7753 阅读 · 2 评论 -
linux下C的一些开发技巧总结
1、判断本机是32位还是64位:(sizeof(long) == 8) ? 64 : 32;2、设置当前进程的最大文件描述符限制:/*http://www.cnblogs.com/niocai/archive/2012/04/01/2428128.html*设定资源使用限制。每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,* 硬限制是软限制的最大值。非授原创 2014-05-05 16:42:39 · 1377 阅读 · 0 评论 -
MFC中将窗口最小化到系统托盘和还原
通过以下步骤可以在MFC程序中将窗口最小化到系统托盘,和还原成窗口,附加代码中如有特殊说明则会用红色标出。1、添加一个ICON图标,其ID为IDI_ICON_TESTICON,在VS2008坐标的Resource View(资源视图)中添加,该图标主要用于在托盘区显示;在头文件中定义添加托盘图标的消息号(用户所有对托盘的消息将对应此消息号):#define WM_ICON_NOTIF...原创 2019-09-29 10:57:02 · 1285 阅读 · 0 评论 -
linux g++ undefined reference to `dlopen'类问题
main.cpp:(.text+0x19): undefined reference to `dlopen'main.cpp:(.text+0x22): undefined reference to `dlerror'main.cpp:(.text+0x62): undefined reference to `dlsym'需要在编译时加上-ldl。将原来的编译命令:g++ cfgfile.cpp...原创 2019-09-29 12:06:45 · 1240 阅读 · 0 评论 -
c++随笔
1、关键字explicitC++隐式类类型转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。《C++primer》p394;关键字explicit可以禁止“单参构造函数”被用于自动类型转换。例如: Class CAge1 { int m_iAge; public: age(int iAge){m_i...原创 2019-09-29 12:08:05 · 612 阅读 · 0 评论 -
通过窗口名字(caption的内容)查找窗口,并将其隐藏或者置顶显示
1、下面的代码可以通过窗口的名字找到置顶的窗口对象CWnd*m_TestWnd = FindWindow(NULL,_T("Hello,Test window"));if (NULL !=m_TestWnd){m_TestWnd->ShowWindow(SW_HIDE);}上述代码可以将窗口隐藏,如果将隐藏的窗口显示则调用ShowWindow(SW_S...原创 2019-09-29 10:57:43 · 1782 阅读 · 0 评论