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?即使它们不相等,也应该aligned在Byte中如果没有对齐那么至少有一个整个Byte是无用的?
示例代码:
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选项仅支持整数吗?