2011年3月19日 星期六

寫作小技巧in C


有些code寫的有些trick,不過常常因為太久沒用就忘記了,所以我決定特別留一篇,專門收集這種短小精幹的code。

判斷是不是2的n次方
if_power_of_2(n) (n != 0 && ((n & (n -1)) == 0))


XOR swap
void swap(int *x, int *y) {
    if (x != y) {
        *x ^= *y;
        *y ^= *x;
        *x ^= *y;
    }
}


Memory Alignment
作embedded常常會需要作一些Memory alignment的動作的動作,Linux的Netlink就有一小段macro可以拿來用。
#define NLMSG_ALIGNTO       4U // 作4byte alignment
#define NLMSG_ALIGN(len)    (((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1))
比如要讓NLMSG_HDRLEN能符合4byte-alignment就是定義如下的macro
#define NLMSG_HDRLEN        ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))
陸續收集中...


2011年3月12日 星期六

GCC - Attributes - warn_unused_result


常常發現有些人對於funcion的return value都不太理會,所以後來我就在function上面加上warn_unused_result這個attribute,當programmer沒有使用這個function的return value時,就會跳出warning,嚴格一點再加上-Werror就可以讓這些warning變成error。



GCC VERSION:4.5之原文
The warn_unused_result attribute causes a warning to be emitted if a caller
of the function with this attribute does not use its return value.
This is useful for functions where not checking the result is either a
security problem or always a bug, such as realloc.