当使用指定的初始化程序时,是否可以获得指向'this'结构的指针?

SKi*_*SKi 6 c initialization designated-initializer

这种结构用作链表头:

struct lista
{
    struct lista* next;
    struct lista* prev;
};
Run Code Online (Sandbox Code Playgroud)

当next和prev都指向struct本身时,则列表为空.以下宏可用于初始化结构:

#define LISTA_INIT_EMPTY(list) { .next = (list), .prev = (list) }
Run Code Online (Sandbox Code Playgroud)

这条路:

struct lista my_list = LISTA_INIT_EMPTY(&my_list);
Run Code Online (Sandbox Code Playgroud)

但是,有没有办法通过以下方式做同样的事情,没有宏参数?:

struct lista my_list = LISTA_INIT_EMPTY;
Run Code Online (Sandbox Code Playgroud)

我尝试了以下,但它导致编译错误:

#define LISTA_INIT_EMPTY     { .next = &.next, .prev = &.next }
Run Code Online (Sandbox Code Playgroud)

Shl*_*blu 6

嗯,我看到的唯一方法是不愉快:

#define LISTA_INIT_EMPTY     { .next = (&my_list), .prev = (&my_list) }
Run Code Online (Sandbox Code Playgroud)

一点都不好,因为只有在调用变量时它才有效my_list.并且没有好的方法,因为thisC中不存在.

为什么不使用NULL而不是指向"这个"?如果这不令人满意,保持参数化宏可能是最好的.

编辑:(感谢下面的R评论,我终于理解了需要):

由于没有"this"并且只输入一次变量的名称,我建议使用这样的宏:

#define CREATE_EMPTY_LISTA(name) struct lista name = { .next=&name, .prev=&name }
Run Code Online (Sandbox Code Playgroud)

后来在代码中:

CREATE_EMPTY_LISTA(my_list); // creates and initializez my_list at the same time
Run Code Online (Sandbox Code Playgroud)

  • 我认为OP希望所有列表,包括最初的空列表,都是循环的.这并非完全不合理; 通常它会消除列表处理函数中所有丑陋的角落情况. (2认同)