add at 2015-10-13
inline
和__inline__
由于inline
在ANSI C中并非保留字,直接使用inline
会可能会产生冲突。例如,gcc支持保留字inline
,由于inline
原来不是保留字,在旧的代码中可能已经有一个变量名为inline
,这样就会产生冲突。为了解决这个问题,gcc允许作为保留字使用的inline
前后都加上__
,所以,__inline__
等价于保留字inline
.同样的道理,__asm__
等价于保留字asm
add at 2015-10-13
#define DUMP_WRITE(addr,nr) do { memcpy(bufp,addr,nr); bufp += nr; } while(0)
上面是取自fs/proc/kcore.c
的一个宏.为什么要定义成这种形式呢?能不能定义成下面这样
#define DUMP_WRITE(addr,nr) memcpy(bufp,addr,nr); bufp += nr;
这样是不行的,在一个if语句中,这样会有错误产生.例如说:
if (addr) DUMP_WRITE(addr,nr); else do();
经过预处理就会变成
if (addr) memcpy(bufp,addr,nr); bufp += nr; else do();
显然,这样编译会出错,因为没有括号包住if后面的两个语句.
通过上面这个例子,我们可以发现,使用do-while单次循环的方式定义,就可以避免出现类似问题.
add at 2015-10-13
由于linux要兼容不同的CPU,所以在某些条件下要把一些宏定义为空操作,但是不能留空白.
#define prepare_to_switch() do { } while(0)
这样子定义,不管在什么条件调用这个函数都不会出现错误,如果定义成这样:
#define prepare_to_switch()
那么在上面的if语句中就会出现错误.