摘要: 内联函数是代码被插入到调用者代码处的函数。如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。 宏定义不检查函数参数,返回值什么的,只是展开,相对来说,内联函数会检查参数类型,所以更安全。 内联函数和宏很类似,而区别在于,宏是由预 阅读全文
posted @ 2013-04-04 21:11 在于思考 阅读(13162) 评论(0) 推荐(1) 编辑
摘要: 陷阱一: 记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。比如: 先定义: typedef char* PSTR; 然后: int mystrcmp(const PSTR, const PSTR); const PSTR实际上相当于const char*吗?不是的,它实际上相当于char* const。 原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char* const。 简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。 陷阱二: typedef在语法上是一个存储类的关键字... 阅读全文
posted @ 2013-04-04 21:03 在于思考 阅读(2730) 评论(0) 推荐(0) 编辑
摘要: "#" 代表和一个字符串相连接"##" 代表和一个符号连接,符号可以是变量,或另一个宏符号。举例如下:宏定义如下(1)#define DEV_FILE_NAME "/dev/test_kft"#define OPEN_FILE(fd, n) /{ /fd = open(DEV_FILE_NAME #n,O_RDONLY); /if(fd < 0) /{ /printf("Open device error/n"); /return 0; /} /}如此调用:OPEN_FILE(fd1, 1);OPEN_FIL 阅读全文
posted @ 2013-04-04 20:19 在于思考 阅读(773) 评论(0) 推荐(0) 编辑
摘要: 本文转自:http://www.cnblogs.com/lightsalt/archive/2011/12/19/2293375.html GNC CC是一个功能非常强大的跨平台C编译器,它对C 语言提供了很多扩展,这些扩展对优化、目标代码布局、更安全的检查等方面提供了很强的支持。本文把支持GNU扩展的C 语言称为GNU C。 Linux 内核代码使用了大量的 GNU C扩展,以至于能够编译 Linux 内核的唯一编译器是 GNU CC,以前甚至出现过编译 Linux 内核要使用特殊的 GNU CC 版本的情况。本文是对 Linux 内核使用的 GNU C扩展的一个汇总,希望当你读内核... 阅读全文
posted @ 2013-04-04 15:42 在于思考 阅读(685) 评论(0) 推荐(0) 编辑
摘要: 本文介绍了GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。从inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translation unit(可以简单理解为C源码文件)内的编译行为,只要超出了这个范围inline属性就没有任何作用了。所以inline关键字不应该出现在函数声明中,没有任何作用不说,有时还可能造成编译错误(在包含了sys/compiler.h的情况下,声 阅读全文
posted @ 2013-04-04 15:35 在于思考 阅读(458) 评论(0) 推荐(0) 编辑
摘要: 1 内存地址 逻辑地址:包括在机器语言指令中指定操作数或者一条指令的地址。每个逻辑地址都由一个段选择符和偏移量组成,偏移量指明了从段开始的地方到实际地址的距离。 线性地址:也称为虚拟地址,32位的无符号整数,程序所能使用空间的大小。 物理地址:它与内存地址总线上的数目相同,主要用于内存单元的寻址。 内存控制单元(MMU)通过分段单元的硬件电路把一个逻辑地址转换为线性地址;接着通过分页单元的硬件电路把线性地址转换为一个物理地址(如图1.1)。图1.1 在多处理器的系统中,由于在RAM芯片上的读或写操作必须是串行地执行,所以内存中有个内存仲裁器,当CPU访问的RAM芯片空闲时,就准予访... 阅读全文
posted @ 2013-04-03 19:20 在于思考 阅读(2386) 评论(0) 推荐(1) 编辑
摘要: 今天由于网络启动出错的原因,在网上搜索,发现大部分人的网卡名字都是eth0,可是我的却是p3p1,所以想改成eth0. 然后google了下,发现设备命名什么的都是由udev来动态管理的,根据设备的信息对其进行持久化命名,udev会在系统引导的过程中识别网卡,将mac地址和网卡名称对应起来记录在udev的规则脚本中。udev的规则脚本在/etc/udev/rules.d目录下,而对应的网络持久化命名的规则文件是70-persistent-net.rules。不过我发现我的系统中没有这个规则文件,于是到网上找了下,发现这个规则文件是可以自己写的,只有符合udev规则文件的规范就行。 下面... 阅读全文
posted @ 2013-04-01 20:21 在于思考 阅读(458) 评论(0) 推荐(0) 编辑
摘要: 今天做个实验把vmware中装的fedora16系统复制一份,结果启动复制的fedora16操作系统发现上不了网了,复制前的系统是可以上网的。然后我用ifconfig命令查了下我的网卡信息,发现我的p3p1网卡的地址与我在/etc/sysconfig/network-scripts/ifcfg-p3p1配置文件中配置的静态ip不同,开始以为是网络没有启动,就用systemctl restart network.service命令启动网络,可没想到居然说启动出错,然后我用ifup p3p1启动网卡,居然报error:No suitable device found: no device fo.. 阅读全文
posted @ 2013-04-01 19:59 在于思考 阅读(816) 评论(0) 推荐(0) 编辑
摘要: 题目的意思:有一堆大理石,按其大小分为1-6种价值,两个人想分得的价值相同的大理石,已知每种价值的大理石个数,问是否能让两个人分得价值相同的大理石?题目输入:101200100011000000题目输出:Collection#1:Can'tbedivided.Collection#2:Canbedivided.解题思路:很明显这是一个多重背包问题,可以将问题转化为0/1背包问题解决。将每种价值v的大理石数x,按二进制分解成价值为1*v,2*v,4*v…,2^k-1*v,(x-2^k+1)*v的大理石,其它价值的大理石也这样分解,这样就转化成为0/1背包问题了(由于1,2,4…,2^k- 阅读全文
posted @ 2013-03-13 20:50 在于思考 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 1 ctags下载Ctags源代码,解压,用make命令安装。然后去你的源码目录,如果你的源码是多层的目录, 就去最上层的目录, 在该目录下运行命令: ctags –R,会产生一个名叫tags文件,将该文件拷贝到$HOME/.vim/tags目录下。在vim中运行命令“:set tags=$HOME... 阅读全文
posted @ 2013-03-07 20:27 在于思考 阅读(2508) 评论(3) 推荐(2) 编辑