随笔分类 -  01. ---- C/C++

摘要:摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。但不同操作系统的动态库由 于格式不同,在需要不同操作系统调用时需要进行动态库程序移植。本文分析和比较了两种操作系统动态库技术,并给出了将Visual C++编制的动态库移植到Linux上的方法和经验。推荐linux动态库的创建请阅读:《Linux静态/动态链接库的创建和使用》文章来源:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html1、引言 阅读全文
posted @ 2013-10-30 15:05 木有Some 阅读(7490) 评论(0) 推荐(0) 编辑
摘要:文章来源:http://www.cnblogs.com/houkai/archive/2013/06/05/3119513.html代码复用是提高软件开发效率的重要途径。一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架,ATL、MFC等,它们都以源代码的形式发布。由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”。“白盒复用”的缺点比较多,总结起来有4点。 暴露了源代码;多份拷贝,造成存储浪费; 容易与程序员的“普通”代码发生命名冲突; 更新功能模块比较困难,不利于问题的模块化实现; 实际 阅读全文
posted @ 2013-10-27 19:08 木有Some 阅读(2118) 评论(0) 推荐(0) 编辑
摘要:GTK的安装过程比较繁琐,以前也安装过,但没有记录下来,Google一下记录下来备用。利用此方法成功在ubuntu12.04下安装GTK 2.24.101、安装gcc/g++/gdb/make 等基本编程工具sudo apt-get install build-essential2、安装 libgtk2.0-dev libglib2.0-dev 等开发相关的库文件sudo apt-get install gnome-core-devel 3、用于在编译GTK程序时自动找出头文件及库文件位置sudo apt-get install pkg-config4、安装 devhelp GTK文档查看程序 阅读全文
posted @ 2013-10-26 16:02 木有Some 阅读(819) 评论(0) 推荐(0) 编辑
摘要:一、类嵌套的疑问C++头文件重复包含实在是一个令人头痛的问题,前一段时间在做一个简单的数据结构演示程序的时候,不只一次的遇到这种问题。假设我们有两个类A和B,分别定义在各自的有文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的:class B;class A{ public: B b;};class B{ public: A a;};因为在A对象中要开辟一块属于B的空间,而B中又有A的空间,是一个逻辑错误,无法实现的。在这里我们只需要把其中的一个A类中的B类型成员改成指针形式就可以避免这个无限延伸的怪圈了... 阅读全文
posted @ 2013-10-25 16:56 木有Some 阅读(13761) 评论(0) 推荐(2) 编辑
摘要:stdafx.hVC工程里面经常见到stdafx.h这个头文件,以前也没有特别注意,但是这个文件用不好经常会出错,所以就GOOGLE了一下,总算是弄清楚了。。。stdafx的英文全称为:Standard Application Framework Extensions(标准应用程序框架的扩展)。所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。简介预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文 阅读全文
posted @ 2013-10-21 09:53 木有Some 阅读(17283) 评论(0) 推荐(5) 编辑
摘要:1. 文件中的#ifndef头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的: #ifndef #define ...... ...... #endif在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:st... 阅读全文
posted @ 2013-10-18 21:14 木有Some 阅读(2223) 评论(0) 推荐(0) 编辑
摘要:一、野指针“野指针”不是NULL指针,是指向“垃圾”内存的指针。“野指针”的成因主要有三种:(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如 char *p = NULL; char *str = (char *) malloc(100);(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。 free和delete只是把指针所指的内存给释放掉,但并没有把指针本身干掉。free以后其地址仍然不变(非NU. 阅读全文
posted @ 2013-09-22 21:10 木有Some 阅读(930) 评论(0) 推荐(1) 编辑
摘要:最近做的MFC项目中,有个获取其他进程中Edit控件内容的需求,本来以为是个很简单的问题,但是来来回回折腾了不少时间,发博记录一下。 刚开始拿到这个问题,很自然的就想到GetDlgItemText():UINT GetDlgItemText( HWND hDlg, // handle to dialog box int nIDDlgItem, // control identifier LPTSTR lpString, // pointer to buffer for text int nMaxCount // maximum size of string);... 阅读全文
posted @ 2013-09-22 16:28 木有Some 阅读(4526) 评论(0) 推荐(1) 编辑
摘要:为什么会出现这个错误??“error LNK2005: 已经在*.obj中定义” 编程中经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误,弄清楚它形成的原因,就可以轻松解决它了。造成LNK2005错误主要有以下几种情况:1.重复定义全局变量。可能存在两种情况:A、对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下。其实这是错误的,全局变量是针对整个工程的。 正确的应该是在一个CPP文件中定义如下: int g_Test; 那么在使用的CPP文件中就应该使用: extern int g_Test 即可,如果还... 阅读全文
posted @ 2013-09-22 10:53 木有Some 阅读(128454) 评论(1) 推荐(12) 编辑
摘要:对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的。因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才表现出来。前几天线上模块因堆内存写越界1个字节引起各种诡异崩溃,定位问题过程中的折腾仍历历在目,今天读到《深入理解计算机系统》第9章-虚拟存储器,发现书中总结了C程序中常见的内存操作有关的10种典型编程错误,总结的比较全面。故作为笔记,记录于此。http://blog.csdn.net/slvher/article/details/91505971. 间接引用无效指针 进程虚拟地址空间的某些... 阅读全文
posted @ 2013-08-05 15:18 木有Some 阅读(624) 评论(0) 推荐(0) 编辑
摘要:来源http://blog.csdn.net/northhero/article/details/4514363我们可以发现,SDK程序中多了一个HWND类型的变量hwnd。该变量用来保存由CreateWindowEx函数创建的窗口句柄,并将其作为参数传递给随后的显示窗口操作(ShowWindow函数)和更新窗口操作(UpdateWindow函数)。而我们自定义的实现代码中,CWnd类定义了一个HWND类型的成员变量:m_hWnd,用于保存这个窗口句柄。首先CWnd类的CreateEx函数创建窗口,并将该窗口句柄保存到这个成员变量,接着调用CWnd类的ShowWindow函数显示窗口时,就不需 阅读全文
posted @ 2013-07-25 11:46 木有Some 阅读(586) 评论(0) 推荐(0) 编辑
摘要:对指针的应用是C语言编程的精髓所在,而回调函数就是C语言里面对函数指针的高级应用。简而言之,回调函数是一个通过函数指针调用的函数。如果你把函数指针(函数的入口地址)传递给另一个函数,当这个函数指针被用来调用它所指向的函数时,我们就说这个函数是回调函数。为什么要使用回调函数呢?我们先看一个小例子: Node * Search_List (Node * node, const int value) { while (node != NULL) { if (node ->... 阅读全文
posted @ 2013-06-10 16:57 木有Some 阅读(502) 评论(0) 推荐(0) 编辑
摘要:在C中,并没有字符串这个数据类型,而是使用字符数组来保存字符串。C字符串实际上就是一个以null('\0')字符结尾的字符数组,null字符表示字符串的结束。需要注意的是:只有以null字符结尾的字符数组才是C字符串,否则只是一般的C字符数组。C字符串定义时可以利用"="号进行初始化,但是以后不能利用"="对C字符串进行赋值。对C字符串的操作需要通过"string"文件中定义的字符串处理函数。例如://字符串的初始化char a[11] = "huanying";//字符串的赋值strcpy(a,& 阅读全文
posted @ 2013-06-08 23:32 木有Some 阅读(11448) 评论(0) 推荐(1) 编辑
摘要:ANSWER:It's likely because of how often you are flushing the stream to disk in the C++ code. Insertingendlinto a stream inserts a new line and flushes the buffer, whilefprintfdoesn't cause a buffer flush.So your C++ example performs 20,000,000 buffer flushes while your C example will only fl 阅读全文
posted @ 2013-05-17 21:47 木有Some 阅读(433) 评论(0) 推荐(0) 编辑
摘要:c/c++中内存区域划分大总结一、 在c中分为这几个存储区 1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放4.另外还有一个专门放常量的地方。- 程序结束释放5 程序代码区,存放2进制代码。在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管. 阅读全文
posted @ 2013-04-08 22:11 木有Some 阅读(561) 评论(0) 推荐(1) 编辑
摘要:编写一个程序,以十六进制方式按字节输出一个int类型的每个字节。方法一:使用指针强制转换,将指向int型的指针强制转换成无符号char型,然后通过指针运算输出各个字节。 1 #include<stdio.h> 2 3 int main() 4 { 5 int i = 87654321; 6 7 unsigned char* j = (unsigned char*) &i; 8 9 printf("%X\n",*j);10 printf("%X\n",*(j + 1));11 printf("%X\n",*(j + 阅读全文
posted @ 2013-03-29 19:05 木有Some 阅读(1624) 评论(0) 推荐(0) 编辑
摘要:一、工具的使用 1、学会使用vim/emacs,vim/emacs是 Linux下最常用的源码编辑具,不光要学会用它们编辑源码,还要学会用它们进行查找、定位、替换等。新手的话推荐使用vim,这也是我目前使用的文本编辑器。 2、学会makefile文件的编写规则,并结合使用工具aclocal、autoconf和automake生成makefile文件。 3、掌握gcc和gdb的基本用法。掌握gcc的用法对于构建一个软件包很有益处,当软件包包含的文件比较多的时候,你还能用gcc把它手动编译出来,你就会对软件包中各个文件间的依赖关系有一个清晰的了解。 4、掌握svn/cvs的基本用法。这是l... 阅读全文
posted @ 2013-01-27 13:06 木有Some 阅读(362) 评论(0) 推荐(0) 编辑
摘要:ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间。 在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符: 1、插入器(<<) 向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"Write Stdout"<<'\n';就表示把字符串"Write Stdout"和换行字符('\n')输出到标准输出流。 2 阅读全文
posted @ 2013-01-25 11:52 木有Some 阅读(429) 评论(0) 推荐(0) 编辑
摘要:C/C++ 语言中表达式的求值 --裘宗燕 北京大学数学学院信息科学系本文基本内容发表于《编程高手》杂志 2004 年第 12 期 经常可以在一些讨论组里看到下面的提问:“谁知道下面 C 语句给 n 赋什么值?” m = 1; n = m+++m++; 最近有位不相识的朋友发 email 给我,问为什么在某个 C++系统里,下面表达式打印出两个4,而不是 4 和 5: a = 4; cout << a++ << a; C++不是规定 << 操作左结合吗?是C++书上写错了,还是这个系统的实现有问题? 要弄清这些,需要理解的一个问题是:如果程序里某处修改了一个 阅读全文
posted @ 2012-12-27 22:51 木有Some 阅读(300) 评论(0) 推荐(0) 编辑
摘要:先看看基本区别:i++ :先在i所在的表达式中使用i的当前值,后让i加1++i :让i先加1,然后在i所在的表达式中使用i的新值看一些视频教程里面写for循环的时候都是写 ++i 而不是 i++,上网搜索了一下,原来有效率问题++i相当于下列代码 i += 1; return i; i++相当于下列代码 j = i; i += 1; return j; 当然如果编译器会将这些差别都优化掉,那么效率就都差不多了。 阅读全文
posted @ 2012-12-25 20:17 木有Some 阅读(6578) 评论(0) 推荐(2) 编辑

点击右上角即可分享
微信分享提示