
C/C++
codetracer
学习造轮子
展开
-
explicit 防止你的类被偷换
<br />让编译器进行隐式类型转换所造成的弊端要大于它所带来的好处,所以除非你确实需要,不要定义类型转换函数。<br /><br />见原文http://blogold.chinaunix.net/u2/70445/showart_1332342.html;<br /><br /><br />explicit作用:<br />在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。<br />explicit使用注意事项:<b转载 2011-03-11 06:51:00 · 548 阅读 · 0 评论 -
柔性数组
<br /><br /> <br />c99中<br /> <br /> 结构中的最后一个元素允许是未知大小的数组 这就叫做柔性数组成员。<br /> <br />但结构中的柔性数组前面必须至少一个其他 成员,柔性数组成员允许结构中包含一个大小可变的数组.<br /> <br />sizeof返回的这种结构大小不包括柔性数组的内存.<br /> <br />包含柔数组成员的结构用malloc函数进行内存的动态分配,且分配的内存应该大于结构的大小 以适应柔性数组的预期大小.<br /> <br /> 柔性数组原创 2011-04-04 08:36:00 · 580 阅读 · 0 评论 -
可变参数函数
<br />关于这个东西,是C语言里面灵活的体现。<br /> <br />通过这种定义方式,我们可以直接访问参数的传入堆栈,利用这样一个原理,就可以自如地写入多个参数。<br /> <br />但是危险性也是很明显的,我们必须自己控制,何时停止在堆栈上访问,很容易越界访问。<br /> <br />这里有非常详细的用法。<br /> <br />总结下来这几部分<br /> <br />头文件: #include<stdarg.h><br /> <br />几个宏定义:<br /> <br />原创 2011-04-04 08:48:00 · 693 阅读 · 0 评论 -
关于字符编码 g_convert(), g_locale_to_utf8()
在GTK中,字符编码的默认形式是UTF-8的,其中所有显示的字符串,都需要使用utf8编码才能正常显示。 因此,几个字符编码的转换函数变得很重要。当然了,在其他的一些开发框架中字符编码转换的函数也是很重要的。这些工作决定我们的程序在执行的时候是否会显示乱码。 以下为g_lib中的几个转换函数。 在使用这几个函数的时候,首先要弄明白本地的字符编码格式,所以了,要想编写移植性好原创 2011-06-07 14:06:00 · 7630 阅读 · 1 评论 -
几种函数调用方法(关键字)
__cdecl 是C DECLaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。 _stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,如果是转载 2011-06-13 22:37:00 · 1334 阅读 · 0 评论 -
C++ 经典开源代码
在如下的库支持下,开发的系统可以很方便移植到当前大部分平台上运行<br />而无需改动,只需在对应的平台下 用你喜欢的编译器 重新编译即可<br />经典的C++库<br /> STLport-------SGI STL库的跨平台可移植版本,在以前有些编译器离符合<br /原创 2011-03-09 20:46:00 · 4324 阅读 · 0 评论 -
C++不初始化,就会这样子~
#include using namespace std; void a(){ volatile int array[10]; //可以去掉 volatile for (int i = 0; i < 10; i++) array[i] = i原创 2011-07-15 13:17:20 · 761 阅读 · 0 评论 -
使用system()函数调用Linux脚本
system()函数在函数库中,通过他可以调用Linux中的脚本。具体使用可以用 man system来看。 这个函数就一个参数,就是你要执行的命令的字符串。比如,调用的脚本位于/home/usr/joker/test.sh,那么就可以这样在c/c++中调用system("/原创 2011-07-30 11:47:27 · 3367 阅读 · 0 评论 -
絮絮叨叨C++ template
关键字typename 被用来作为型别之前的标识符号。template 型别的指针class MyClass { typename T::SubType * ptr; ...};这里,typename 指出SubType 是 class T 中定原创 2011-09-16 23:34:30 · 531 阅读 · 0 评论 -
使用static关键字保存和恢复程序运行状态
今天做了一个控制Linux终端状态的实验,程序运行过程中,终端需要调整到 nobuffer、noecho。即,无缓冲,无回显状态。并且一次仅能接受一个字符的输入。实现如下:int set_cr_noecho_mode(){ struct termios原创 2011-09-18 11:55:44 · 775 阅读 · 0 评论 -
Linux进程的计时器和间隔计时器
比较常用的时间控制函数就是sleep();让我们当前的进程休眠指定的秒数。系统中的每个进程都有一个私有的闹钟。这个闹钟很像一个计时器,可以设置在一定秒数后的闹钟。 时间一到,时钟就发送一个信号SIGALRM到进程。除非为SIGALRM设置了处理函数,否则信号将杀死这个进程。s原创 2011-09-21 00:08:23 · 7833 阅读 · 0 评论 -
文件描述符、文件句柄、文件路径的转换接口
文件路径 到 文件指针:filepath --fopen()-->FILE*; 文件路径 到 文件描述符:filepath--open()--fd; 文件描述符 到 文件指针:fd--fdopen()-->FILE*; 文件描述符 到 文件路径:fd--readlink(/proc/%getpid()/fd/%fd"))-->filepath; 文件指针转载 2012-04-30 10:28:14 · 1523 阅读 · 0 评论 -
读取大文件,大于2G,偏移量不给力
32位系统,就支持最大2G左右的文件偏移……50G的文件何去何从……Linux下,可以使用fseeko 函数。或者使用内存映射技术。原创 2011-04-01 18:58:00 · 2074 阅读 · 0 评论 -
要是总忘 就写下来 宏定义中的一些符号
<br />1.在宏定义中, # 表示字符串<br /> <br />#define redisAssert(_e) #_eredisAssert(name);展开后相当于"name"; <br /> <br />#define DEV_FILE_NAME "/dev/test_kft" #define OPEN_FILE(fd, n) / { / fd = open(DEV_FILE_NAME #n,O_RDONLY); / if(f原创 2011-03-30 17:59:00 · 765 阅读 · 0 评论 -
运算符重载
<br /> <br />几个常用的运算符的重载:<br />I/O :<br /> <br />当我们对一个类重载<<,>>运算符之后,就可以直接使用cout<<x,cin>>x两种简单的操作 a.重载输出运算符<< 因重最左边的操作数是ostream,自然就不能用类的成员函数重载,而只能以类的友元函数进行重载 //<<函数定义格式 friend ostream operator<<(ostream&,const nameclass&)const; //<<函数实现部分 ostre原创 2011-03-30 17:41:00 · 539 阅读 · 0 评论 -
mutable
<br />关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员<br />我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,<br />对像的状态也会随之发生变化!<br /> <br /> <br />如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是<br />该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员<br />进行赋值.这个时候就需要用到mutable关键字了<br /> <原创 2011-03-11 06:56:00 · 414 阅读 · 0 评论 -
feof() 函数的陷阱……
<br />使用feof()的时候,掉陷阱里了,总是少输出一条:<br /> while ( !feof(fp) ) { flag = fgets(buffer,300,fp); cout << buffer<<endl; sscanf(buffer,"%s %d %d", temp_name,&salary,&count); temp = new Set; temp->set_name(temp_name); temp->set原创 2011-03-10 19:09:00 · 4690 阅读 · 0 评论 -
[转] C++ 中的三种new
C++中的 new 有3中使用方式,它们是: plain new 、 nothrow new 和 placement new 。这3种形式极大地扩展了内存分配的灵活性。 1. plain new 从字面上看,这就是普通的 new ,也是我们平时使用的 new ,这里就不多说。 2. nothrow new nothrow new 就是部抛出异常的 new ,在失败的时候返回 NULL;所以使用时不需要设置异常处理,而普通的 new 在使用失败时转载 2011-03-11 12:40:00 · 781 阅读 · 0 评论 -
注意细节和习惯(二)调试
1.按照一份比较好的编码规范书写代码,这个样做不仅仅是为了增强可读性,更重要的是可以帮你减少调试的时间,无形之间赋予你更多的生命~2.使用良好的注释风格,为了别人,更为了自己。3.使用版本管理器吧,在疯狂的修改之后,你可能会陷入僵局,这个时候,重新开始是个不错的选择。4.增加足够的参数检查。千万不要以为这个地方不可能出现问题,就忽略了参数检查,程序的漏洞,往往就在这些不可能中。5.关于内存的事情,这个东西,没事就拿出来看看吧。可以使用内存工具。这里是一个内存调试的解说。6.Linux下的技巧。测试工具,源码原创 2011-03-12 18:29:00 · 539 阅读 · 0 评论 -
一个简单的抛出异常总结
这个程序,在检测到分母为零的时候,输出“除数为零”,然后结束。#include #include #include double Div (double a, double b ){ if (0 == b) { throw "除数为零"; } else { return a / b; }}int main(){ double a, b; try { cout > a;原创 2011-03-15 01:03:00 · 591 阅读 · 0 评论 -
windows 加载动态链接库extern "C" 、cdecl、stdcall、fastcall、declspec
<br />这个是动态链接库与静态链接库的区别:<br /> <br />http://www.cnblogs.com/yaozhongxiao/archive/2010/09/15/1826814.html<br /> <br />这个是关于extern “C” 的说明:<br /> <br />http://www.cnblogs.com/yaozhongxiao/archive/2010/09/15/1826770.html<br /> <br />这个区分了_declspec(dllexport)原创 2011-03-14 19:28:00 · 1570 阅读 · 0 评论 -
STL string 的学习(一)
<br />先把<string> 包含上再说。<br /> <br />1.string::size_type idx = filename.find('K');<br /> if(idx == string::npos)<br /> {<br />//查找失败的处理,idx必须是 size_type 类型的,不可以是其他类型,否则会出错<br />// string 不是一个C-string串,所以了,没有结尾的 '/0'<br />//npos 类似于‘/0’<br />}<br /> <br原创 2011-03-26 00:06:00 · 607 阅读 · 0 评论 -
简单的INI解析器
小的ini解析器,缩进……ini_parser.cpp/*** 作者: 王政杰* 日期: 2011.3.16* 功能描述: ini文件解析器的具体实现* 可以读取文件,并装入map结构中,供用户调用。** 存储方式,section == map * key == map*/#include "ini_parser.h"namespace my_ini { static const char left_tag = '[';原创 2011-03-23 20:34:00 · 1742 阅读 · 0 评论 -
内存池的资料
<br /> <br />面向对象思想,实现挺复杂的一个内存池:<br /> <br /> <br />基于C语言的一个内存池,还有性能分析:<br /> <br /> <br />jabberd2的内存池:<br /><br /><br /> <br />内存池与new 的比较,这里:<br /> <br /> <br />这个比较不错:<br /> <br />经典的内存池技术,csdn上的大大写的。<br /><br /><br />谢谢各位作者,学习了。<br /> <br /><br /><br转载 2011-03-24 19:02:00 · 677 阅读 · 0 评论 -
关于#pragma warning
<br />1. #pragma warning只对当前文件有效(对于.h,对包含它的cpp也是有效的),而不是对整个工程的所有文件有效。当该文件编译结束,设置也就失去作用。<br /><br /><br />2. #pragma warning(push)<br />存储当前报警设置。<br />#pragma warning(push, n)<br />存储当前报警设置,并设置报警级别为n。n为从1到4的自然数。<br /> <br /><br /><br />3.转载 2011-03-25 09:57:00 · 693 阅读 · 0 评论