小编Don*_*all的帖子

Linux内核中的红色黑色节点的结构对齐

Linux内核中rb_node的定义如下:

struct rb_node {
    unsigned long  __rb_parent_color;
    struct rb_node *rb_right;
    struct rb_node *rb_left;
} __attribute__((aligned(sizeof(long))));

#define rb_parent(r)   ((struct rb_node *)((r)->rb_parent_color & ~3))
#define rb_color(r)   ((r)->rb_parent_color & 1)
#define rb_set_red(r)  do { (r)->rb_parent_color &= ~1; } while (0)
#define rb_set_black(r)  do { (r)->rb_parent_color |= 1; } while (0)
Run Code Online (Sandbox Code Playgroud)

我的问题是__rb_parent_color,其中最后一位是颜色,其余是指向其父级的指针.

我学到有人说最后2位__rb_parent_color因为没用aligned(sizeof(long)),但为什么呢?

不是sizeof(struct rb_node *)4还是不是sizeof(unsigned long)4?即使它们不相等,也应该alignedByte中如果没有对齐那么至少有一个整个Byte是无用的?

c binary-tree struct red-black-tree linux-kernel

3
推荐指数
1
解决办法
940
查看次数

gcc宏定义选项不适用于字符串

示例代码:

main()
{
    printf("%d\n", MARCO);  
//  printf("%s\n", MARCO);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用gcc -D选项时,我发现以下命令有效:

gcc -D MARCO=12345 test.c
Run Code Online (Sandbox Code Playgroud)

但是当我将12345更改为字符串时:

gcc -D MARCO=abcde test.c
Run Code Online (Sandbox Code Playgroud)

发生错误:

error: ‘abcde’ undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)

我已经试过-DMARCO=abcde,-DMARCO="abcde",-D MARCO="abcde",所有这一切都失败了.

-D选项仅支持整数吗?

c linux gcc

2
推荐指数
1
解决办法
5812
查看次数

标签 统计

c ×2

binary-tree ×1

gcc ×1

linux ×1

linux-kernel ×1

red-black-tree ×1

struct ×1