随笔分类 -  C语言

摘要:1.__attribute__关键字主要是用来在函数或数据声明中设置其属性。给函数赋给属性的主要目的在于让编译器进行优化。函数声明中的__attribute__((noreturn)),就是告诉编译器这个函数不会返回给调用者,以便编译器在优化时去掉不必要的函数返回代码。GNU C的一大特色就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__书写特征是:__attribute__前后都有两个下划线,并且后面会紧跟 阅读全文
posted @ 2012-10-26 22:50 beanmoon 阅读(702) 评论(0) 推荐(0) 编辑
摘要:1.出处fflush是libc.a中提供的方法,fsync是系统提供的系统调用。2.原形fflush接受一个参数FILE *.fflush(FILE *);fsync接受的时一个Int型的文件描述符。fsync(int fd);3.功能fflush:是把C库中的缓冲调用write函数写到磁盘[其实是写到内核的缓冲区]。fsync:是把内核缓冲刷到磁盘上。c库缓冲-----fflush---------〉内核缓冲--------fsync-----〉磁盘另外关于内核缓冲,标准库缓冲和用户空间缓冲的说法见APUE 5.14:One inefficiency inherent in the stan 阅读全文
posted @ 2012-10-23 15:22 beanmoon 阅读(705) 评论(0) 推荐(0) 编辑
摘要:volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错。例如:volatile int i=10;int j = i;...int k = i;volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volat 阅读全文
posted @ 2012-10-23 15:18 beanmoon 阅读(207) 评论(0) 推荐(0) 编辑
摘要:register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。例如下面的内存块拷贝代码, #ifdef NOSTRUCTASSIGN memcpy(d, s, l) {register char *d; register char *s; register int i; while (i--) *d++ = *s++; } #endif 但是使用register修饰符有几点限制。 首先,register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或... 阅读全文
posted @ 2012-10-23 15:17 beanmoon 阅读(395) 评论(0) 推荐(0) 编辑
摘要:'Restrict'PointersOneofthenewfeaturesintherecentlyapprovedCstandardC99,istherestrictpointerqualifier.Thisqualifiercanbeappliedtoadatapointertoindicatethat,duringthescopeofthatpointerdeclaration,alldataaccessedthroughitwillbeaccessedonlythroughthatpointerbutnotthroughanyotherpointer.The'r 阅读全文
posted @ 2012-10-06 21:44 beanmoon 阅读(398) 评论(0) 推荐(0) 编辑
摘要:先看一段代码: 1: char greeting[] = “Hello”; 2: char* p = greeting; //non-const pointer,non-const data 3: const char* p = greeting; //non-const pointer,const data; 4: char* const p = greeting;//const pointer,non-const data; 5: const char* const p = greeting; //const pointer,const data; 6: 关于定义的阅读,一直以... 阅读全文
posted @ 2012-09-23 16:22 beanmoon 阅读(3458) 评论(0) 推荐(0) 编辑
摘要:概述由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦;即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,有些人采用指针参数来解决问题.下面就c语言中处理不定参数数目的问题进行讨论.定义大家先看几宏.在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义:#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一个可 阅读全文
posted @ 2012-09-23 13:18 beanmoon 阅读(224) 评论(0) 推荐(0) 编辑
摘要:C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错。伴随着不同源文件变量和函数之间的相互引用以及相互独立的关系,产生了extern和static关键字。 下面,详细分析一下static关键字在编写程序时有的三大类用法: 一,static全局变量 我们知道,一个进程在内存中的布局如图1所示: 其中.text段保存进程所执行的程序二进制文件,.data段保存进程所有的已初始化的全局变量,.bss段保存进程未初始化的全局变量(其他段中还有很多乱七八糟的段,暂且不表)。在进程的整个生命周.. 阅读全文
posted @ 2012-09-22 22:47 beanmoon 阅读(205) 评论(0) 推荐(0) 编辑

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