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)
嗯,我看到的唯一方法是不愉快:
#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)