从Linux内核中学到的编程技巧


1构建泛型宏 (./linux/include/linux/kernel.h)
#define min(x, y) ({				\
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; })

大家看了就明白是什么意思了。但是我还有几点疑问:
(1)
(void) (&_min1 == &_min2);这行代码是用来干什么的?
(2)为什么{}的外面要加(),不加的时候编译是不通过的,具体是什么原因?
2 范围的扩展
(1) switch 语句
switch(a)
{
case 1 ... 3:
printf("fafadsf");
break;
case 4 ... 8:
printf("dsafaf");
break;
}
(2)数组的初始化

int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
以上部分内核中用的很多。

3 零长度的数组
struct iso_block_store {
atomic_t refcount;
size_t data_size;
quadlet_t data[0];
};
这允许结构中的元素引用结构实例后面紧接着的内存。在需要数量可变的数组成员时,这个特性很有用
应用实例:
struct iso_block_store * p =(void *)malloc(sizeof(struct iso_block_store) + data_size);

4 获得函数的返回地址

如下面的代码所示,__builtin_return_address 接收一个称为 level 的参数。这个参数定义希望获取返回地址的调用堆栈级别。例如,如果指定 level0,那么就是请求当前函数的返回地址。如果指定 level1,那么就是请求进行调用的函数的返回地址,依此类推。

void * __builtin_turn_address( unsigned int level );

在下面的示例中(见 ./linux/kernel/softirq.c),local_bh_disable 函数在本地处理器上禁用软中断,从而禁止在当前处理器上运行 softirqs、tasklets 和 bottom halves。使用 __builtin_return_address 捕捉返回地址,以便在以后进行跟踪时使用这个地址。

void local_bh_disable(void)
{
__local_bh_disable((unsigned long)__builtin_return_address(0));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 下一页

相关内容

    暂无相关文章