Web Analytics

也谈C语言的内联函数

有这样一段代码: /* foo.c */ #include “stdio.h” inline void foo() { printf(“inline foo in %s\n”, __FILE__); } int main() { foo(); return 0; } 我采用C99标准,并在不加任何优化选项的情况下编译之: $ gcc -std=c99 foo.c -o foo foo.c: In function ‘foo’: /tmp/ccLGkuIK.o: In function `main’: foo.c:(.text+0×7): undefined reference to `foo’ collect2: ld returned 1 exit status ...

June 22, 2011 · 6 min · Tony Bai

聆听编程“古训”

市面上关于优秀编程风格和习惯养成的书籍还真不少,其中“叫好又叫座”的书诸如《代码大全》、《编程精粹:编写高质量C语言代码》、《编程匠艺》、《重构》以及《Clean Code》等。不过前些天我在网上下载了一本名为《The Elements of Programming Style》的电子书,看过此书后,我才知道开创编写优秀风格代码之路的鼻祖是谁(不知道是否还有比这本书更加古老的且系统地讲述优良编程元素的书籍了?)。 ...

May 10, 2011 · 3 min · Tony Bai

别为代码的"Bad Smell"提供土壤

上周初参加了一次代码评审,评审时发现一位同事在自己负责的子模块代码里定义了一个私用宏,“重复"这个Bad Smell立马在我头脑中闪现。当时我给出了一个建议:检查一下这个宏定义的必要性,依次检查一下C运行库头文件中是否已经有了同功用宏定义,基础库头文件中是否已经有了同功用宏定义,业务层代码的共用头文件中是否已经有了同功用宏定义。 ...

December 6, 2010 · 2 min · Tony Bai

简说GLIBC strncpy实现

比较以下两组代码,你认为哪组运行的更快些呢? Example1: int n = 100; int n4 = n » 2; int i = 0; int a[100]; for (i = 0; i < n4 ;i += 4) { a[i] = i; a[i+1] = i+1; a[i+2] = i+2; a[i+3] = i+3; } ...

April 15, 2009 · 2 min · Tony Bai

GLIBC strlen源代码分析

直接操作C标准库提供的字符串操作函数是有一定风险的,稍有不慎就会导致内存问题。这周用业余时间写了一个小型的安全字符串操作库,但是测试之后才发现自己的实现有很大的性能缺陷。 在Solaris上初步做了一个简单的性能比对,以下是得到的性能数据(以strlen的数据为例): 当传入的字符串长度为10时,执行100w次: strlen 执行时间是:32762毫秒 my_strlen执行时间是:491836毫秒 ...

April 11, 2009 · 5 min · Tony Bai

P.J.Plauger版本C标准库实现分析之'ctype.h'

如果在你的源代码中经常见到如下代码: /* To Identify a letter */ if ((i >= ‘a’ && i = ‘A’ && i <= ‘Z’)) /* To Identify a digit */ if ( i >= ‘0’ && i <= ‘9’) 这说明你对头文件理解的不是很好,而也恰恰是为了减少代码中重复出现的各种’字符分类’代码而设置的。 ...

July 17, 2006 · 4 min · Tony Bai

P.J.Plauger版本C标准库实现分析之'assert.h'

I believe that seeing a realistic implementation of the Standard C library can help you better understand how to use it. — P.J.Plauger 按照字母序首先我们来看看<assert.h>,这个文件提供的接口功能很简单,但却是我们极其常用的功能-断言机制(如果条件为False,则输出Diagnostics信息,然后Abort)。当然在最终产品中使用断言并不是一种好的方法,不过断言是一种很有用的帮助我们调试程序的好工具。 ...

July 8, 2006 · 3 min · Tony Bai