1. 宏定义中:do{}while(0)
2. i++与++i
3. static
4. extern
5. set -e
6. Makefile
%.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
7. glibc中strcpy
char *strcpy(char *dest,const char *src)
{
char c;
char *s = (char *) src;
const ptrdiff_t off = dest - s - 1;
do
{
c = *s++;
s[off] = c;
}
while (c != '\0');
return dest;
}
网上分析(http://blog.chinaunix.net/uid-23629988-id-2740802.html):
1. glibc这个strcpy的效率在Intel的某些CPU上确实效率不高——我测试了(Intel(R) Pentium(R) 4和Pentium(R) Dual-Core CPU E5300。有兴趣的朋友可以在其它CPU上测试一下,最好不是Intel的;
2. 一般glibc会根据不同的CPU实现不同版本的库函数,如strcpy。当然,我之前也知道这一点,不过我并没有去特意的看特定CPU的strcpy的 代码。而是看这个generic的代码——当时我认为generic的strcpy仍然会高效。那么实际上对于intel的CPU来说,有特定的 strcpy实现代码。所以在intel的CPU上,glibc的strcpy肯定会高效。
最好的答案就是glibc中的generic的实现代码,并不一定会高效。如果真的要学习且实现代码,看来还是要学习该CPU上的特定的实现代码。
8. string.h
C的字符串头文件是<string.h>,在C++里这个文件变成了<cstring>,string前面的c表示这个是c语言的;而C++的字符串头文件是<string>,是利用的模板实现的,跟原先C的实现方法不一样,但要安全得多。
VC++中有<string.h>文件,它就是C中的那个;
而<cstring>文件实际上只是在一个命名空间std中include了<string.h>,这是因为C++要减少名称污染;
所以两个都是可以用的,但C++鼓励用<cstring>。
<string>为字符串实现了一个类,而其实是依靠模板做的,这个可以先不考虑。使用类,可以将问题局部化,类似于把一个大问题分解成一个个小问题;而且类是具有类型安全的。
所以最好最好用C++的类。