![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C 语言编程
文章平均质量分 72
堂吉诃德Time
这个作者很懒,什么都没留下…
展开
-
linux 内核 intptr_t 其实不是指针类型 .
http://blog.csdn.net/moonvs2010/article/details/7490420 最近在看nginx源码,看到有一个类型intptr_t,没有见过,google了一下,有人说是指针类型,但是看nginx源码中对该类型变量的使用,好像不是指针类型。[cpp] view plaincopystatic ngx_int_t 66转载 2014-10-21 20:47:32 · 1162 阅读 · 0 评论 -
GNU C语言的 扩展(二)零长度数组&可变参数宏
GNU C 允许使用零长度数组,在定义变长的头结构时,这个特性非常有用。测试代码:引用 #include #include #include typedef structuser_def{ char *name; int length; char bytes[0];} user_de转载 2014-10-16 23:12:52 · 720 阅读 · 0 评论 -
GNU C语言的 扩展(一)语句表达式
GNU CC 是一个功能非常强大的跨平台 C 编译器,它对 C 语言提供了很多扩展,这些扩展对优化、目标代码布局、更安全的检查等方面提供了很强的支持。这里对支持支持 GNU 扩展的 C 语言成为 GNU C。 在 Linux 内核中使用了大量的 GNU C 扩展,以致 GNU C 成为了内核唯一的编译器。1、语句表达式 GNU C 把包含在括号中的复合语句看做是一个表达式,称为转载 2014-10-16 20:52:53 · 801 阅读 · 0 评论 -
使用typedef语句定义数组类型
使用typedef语句定义数组类型 1. 一维数组类型的定义格式 typedef []; 例如: (1) typedef int vector[10]; (2) typedef char strings[80]; (3) typedef short int array[N]; 第一条语句定义了一个元素类型为int,含有1原创 2014-11-20 10:48:16 · 626 阅读 · 0 评论 -
GNU C语言的 扩展(三)可变参数宏加名字
GCC 支持复杂的宏,它使用一种不同的语法,使你可以给可变参数一个名字,如同其它参数一样,比如:引用 #define debug(format, args...) fprintf(stderr, format, args)这种定义可读性更强,也更容易描述。完整测试代码:引用 #include #define debug(format, args.转载 2014-10-17 21:02:20 · 1172 阅读 · 0 评论 -
GNU C语言的 扩展(四)数组索引初始化&case标号连续范围
标准 C 要求数组或结构变量的初始化值必须以固定的顺序出现。比如初始化一个数组: char a [5] = {'a', 'b','c'}; 则必定是 a[0] 为 a; a[1] 为 b; a[2] 为 c ,这是一个固定的初始化顺序。但在 GNU C 中,通过指定索引,允许初始值以任意的顺序出现。下面是一个示例代码:[font=[object htmloptionelement]]转载 2014-10-18 09:33:40 · 931 阅读 · 0 评论 -
gcc的内建函数__builtin_expect
1.问题引出在内核代码的条件分支中的判断中,经常可以看到如下两条语句:[cpp] view plaincopy/* ...... */ if(unlikely(!something)) /* ...... */ if(likely(something)) /* ...... */ 追述一下可以看到有如下的宏定义:[cpp] view转载 2014-10-18 16:11:57 · 536 阅读 · 0 评论 -
GNU C语言的 扩展(八) linux 内核 段相关宏
在 linux 内核源代码中,与段相关的重要宏定义有:__init , __initdata, __exit, __exitdata 及类似的宏。在 include/init.h 中可以看到:引用 #define __init __attribute__ ((__section__ (".init.text"))) __cold#define __initd转载 2014-10-19 11:50:58 · 630 阅读 · 0 评论 -
GNU C语言的 扩展(七)__attribute__测试
在 http://www.groad.net/bbs/read.php?tid=1032 中转载了一篇关于 __attribute__ 机制说明的文章,这里再用完整的一般测试代码进行测试,作为加深理解与补充。1、__attribute__ format 属性语法格式:format (archetype, string-index, first-to-check)参数转载 2014-10-19 11:46:26 · 2252 阅读 · 0 评论 -
C语言中 %p的含义
格式控制符“%p”中的p是pointer(指针)的缩写。指针的值是语言实现(编译程序)相关的,但几乎所有实现中,指针的值都是一个表示地址空间中某个存储器单元的整数。printf函数族中对于%p一般以十六进制整数方式输出指针的值,附加前缀0x。示例:int i = 1;printf("%p",&i);相当于int i = 1;printf("0x%x",&i);对于3转载 2014-10-18 10:30:43 · 10960 阅读 · 0 评论 -
GNU C语言的 扩展(五) __FUNCTION__ 预定义标志符
GNU CC 预定义了两个标志符保存当前函数的名字,__FUNCTION__ 保存函数在源码中的名字,__PRETTY_FUNCTION__ 保存带语言特色的名字。在 C 函数中,这两个名字是相同的,在 C++ 函数中,__PRETTY_FUNCTION__ 包括函数返回类型等额外信息,Linux 内核只使用了 __FUNCTION__。 通常,在调式中最让人烦恼的阶段是不断地转载 2014-10-18 16:50:35 · 777 阅读 · 0 评论 -
GNU C语言的 扩展(六)内建函数
GNU C 提供了大量的内建函数,其中很多是标准 C 库的内建版本,例如 memcpy(),它们与对应的 C 库函数功能相同。而其他内建的名字通常以 __builtin 开始。__builtin_return_address (LEVEL)内建函数 __builtin_return_address 返回当前函数或其调用者的返回地址,参数 LEVEL 指定在栈上搜索框架的个数,0 表示当转载 2014-10-18 16:54:36 · 1096 阅读 · 0 评论 -
虚函数和纯虚函数的区别
首先:强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数,才代表函数没有被实现。定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。1、简介假设我们有下面的类层次:[cpp] view plaincopyclas转载 2014-11-18 10:54:29 · 480 阅读 · 0 评论 -
基于树的查找--------------二叉查找树
1,为什么要分析二叉查找树(又名:二叉排序树)? 正真分析开源代码或软件开发中,基于树的查找是难免会有的,现在多用的是红黑树,而红黑树是基于平衡树的,而平衡树是基于查找树的,而查找树是基于二叉树的,二叉树大家都很熟悉,所以先从查找树开始分析。这样才便于分析平衡树,最终的分析对象将会是红黑树。----------------------------------转载 2014-11-01 17:07:10 · 628 阅读 · 0 评论 -
汉诺塔问题递归算法分析
一个庙里有三个柱子,第一个有64个盘子,从上往下盘子越来越大。要求庙里的老和尚把这64个盘子全部移动到第三个柱子上。移动的时候始终只能小盘子压着大盘子。而且每次只能移动一个。 1、此时老和尚(后面我们叫他第一个和尚)觉得很难,所以他想:要是有一个人能把前63个盘子先移动到第二个柱子上,我再把最后一个盘子直接移动到第三个柱子,再让那个人把刚才的前63个盘子从第二个柱子上移动到第三个柱子上,我的转载 2014-10-30 17:24:12 · 565 阅读 · 0 评论 -
Linux GCC常用命令
1简介2简单编译2.1预处理2.2编译为汇编代码(Compilation)2.3汇编(Assembly)2.4连接(Linking)3多个程序文件的编译4检错5库文件连接5.1编译成可执行文件5.2链接5.3强制链接时使用静态链接库1简介GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C转载 2014-10-25 20:03:22 · 388 阅读 · 0 评论 -
linux gcc编译C程序
一个c语言程序从源文件到生成可执行文件,编译器需要共经历4个步骤:1)预处理:把c文件中预处理命令扫描处理完毕,即对源代码文件中的文件包含(#include)、预编译语句(如宏定义#define等)进行分析,此时生成的文件仍然是可读的。2) 编译:把预处理后的结果编译成汇编或者目标模块,即生成汇编语言文件,此时生成的文件仍然是可读的汇编文件。3)汇编:把编译出来的结果汇编成具体CPU上转载 2014-10-25 20:24:00 · 523 阅读 · 0 评论 -
C++中的inline用法
一、inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。 表达式形式的宏定义一例: #define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))为什么要取代这种形式呢,且听我道来: 1. 首先谈一下在C中使用这种形式宏定义的原因,C语言是一个效原创 2014-11-12 11:00:16 · 489 阅读 · 0 评论 -
C++ 默认构造函数
一直认为若程序员没有自己定义无参数的构造函数,那么编译器会自动生成默认构造函数,来进行对成员函数的初始化,但这种认为是有误的,不全面的.默认的构造函数分为有用的和无用的,所谓无用的默认构造函数就是一个空函数、什么操作也不做,而有用的默认构造函数是可以初始化成员的函数。对构造函数的需求也是分为两类:一类是编辑器需求,一类是程序的需求。程序的需求:若程序需求构造函数时,就是要程转载 2014-11-13 14:04:56 · 515 阅读 · 0 评论 -
C++ 下标运算符 重载
我们常用下标运算符operator[]来访问数组中的某个元素.它是一个双目运算符,第一个运算符是数组名,第二个运算符是数组下标.在类对象中,我们可以重载下标运算符,用它来定义相应对象的下标运算.注意,C++不允许把下标运算符函数作为外部函数来定义,它只能是非静态的成员函数.下标运算符定义的一般形式: T1T::operator[](T2);其中,T是定义下标运算符的类,它不必原创 2014-11-12 15:44:09 · 1807 阅读 · 0 评论 -
编译器预处理#ifndef 条件编译
这是 //if not defined的简写,是宏定义的一种,它是可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等。实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译。转载 2014-10-12 09:47:47 · 548 阅读 · 0 评论 -
二叉树 C 实例代码
在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有个结点;深度为k的二叉树至多有个结点;对任何一棵二叉树T,如果其终端结点数为,度为2的转载 2014-10-28 15:42:53 · 1058 阅读 · 0 评论 -
平衡树的调整 案例与代码
一,分析平衡二叉查找树有什么意义? 平衡二叉查找树是对二叉查找树的改进,那二叉查找树哪些地方是不尽人意的呢?在分析二叉查找树的平均查找长度时,会发现,二叉查找树的平均查找长度与二叉查找树的形态有关系,最坏的情况是退化为链表,查找变为线性查找,平均查找长度为(n 1)/2.最好的情况就是树的形态与折半查找的判断树形式。平均查找长度为logN。平衡二叉树就是为了保证转载 2014-10-28 16:56:11 · 897 阅读 · 0 评论 -
void及void指针含义的深刻解析
void的含义void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。转载 2014-10-12 09:06:46 · 434 阅读 · 0 评论 -
C++中的单例模式
单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。 单例模式有许多种实现方法,在C++中,甚至可以直接用一个全局变量做转载 2014-11-14 11:00:35 · 496 阅读 · 0 评论 -
递归算法详细分析 C语言
C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。 许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的《C语言程序设计》一书中就是从阶乘的计算开始的函数递归。导致读过这本经书的同学们,看到阶乘计算第一个想法就是递归。但是在阶乘的计算里,递归并没有提供任何优越之处。在菲波那契数列中,它的效率更是低的非常恐怖。 这里有转载 2014-10-30 11:43:58 · 597 阅读 · 0 评论 -
GNU C语言的 扩展(九) unused 属性用于函数和变量
unused 属性用于函数和变量,表示该函数或变量可能不使用。测试代码:引用 #include int main(){ int ai = 10; int bi = 11; printf("%d\n",bi); return 0;}编译一下:引用 beyes@l转载 2014-10-19 11:50:53 · 8553 阅读 · 0 评论