gpt4 book ai didi

c - 在 C 中静态初始化链表的最佳方法?

转载 作者:行者123 更新时间:2023-12-04 09:33:38 26 4
gpt4 key购买 nike

我有一个单链表类型,如下所示:

struct point { int x, y; };
struct point_list {
struct point value;
const struct point_list *next;
};

我想静态初始化这些列表之一,可能有几十个条目。我想用一致的缩进每行写一个项目,以便于编辑列表。

到目前为止,我想出的最好的是:
const struct point_list *const my_list =
&(const struct point_list) { .value = { 1, 2 }, .next =
&(const struct point_list) { .value = { 3, 4 }, .next =
&(const struct point_list) { .value = { 5, 6 }, .next =
NULL
}}};

但缺点是:
  • 添加或删除项目时,我需要更新最后一行的右大括号的数量。
  • 可能很难说服代码格式化程序保持这种风格。

  • 有没有更好的办法?

    如果我们有递归宏,也许这样的事情可以工作:
    const struct point_list *const my_list = POINT_LIST(
    ((struct point) { 1, 2 }),
    ((struct point) { 3, 4 }),
    ((struct point) { 5, 6 }),
    );

    如果我们可以在编译时运行代码,也许这样的事情可以工作:
    #define array_length(X) (sizeof(X) / sizeof(X[0]))

    constexpr const struct point_list *array_to_list(size_t length, struct point *values) { ... }

    const struct point my_array[] = {
    { 1, 2 },
    { 3, 4 },
    { 5, 6 },
    };
    const struct point_list *const my_list = array_to_list(array_length(my_array), my_array);

    最佳答案

    而不是声明 my_list作为指针,您可以将其声明为数组:

    struct point_list const my_list[] = {
    { .value = { 1, 2 }, .next = &my_list[1] },
    { .value = { 3, 4 }, .next = &my_list[2] },
    { .value = { 5, 6 }, .next = NULL }
    };

    如果您还想要 my_list要成为一个指针,你可以做类似的事情:
    static struct point_list const my_list_data[] = {
    // ...
    };
    const struct point_list *const my_list = my_list_data;

    关于c - 在 C 中静态初始化链表的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60022421/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com