c - 在构建时声明指针结构

标签 c linux gcc

这就是我在构建时用指针初始化结构的方法。

struct example_struct {
    int count;
    int *values;
};

int i1[] = { 1, 2 };
int i2[] = { 10, 20, 30 };

struct example_struct items[] = {
    { .count = 2, .values = &i1[0] },
    { .count = 3, .values = &i2[0] },
    { .count = 0, .values = NULL },
};

我面临的实际情况比这个例子相当冗长和复杂。
因此,我正在寻找一种方法来避免数组的额外声明。相反,我想直接记录到位的数组, 这意味着将 .values = &i1[0] 转换为 .values = { 1, 2 } (不幸的是,这对 gcc 来说是无效语法)。

是否有解决方案?

需要明确的是,我知道这个示例可以更改为

items[] = {
    2,   1, 2,
    3,   10, 20, 30
};

并以不同的方式读取值。但我的情况确实需要指向通常在运行时从变量配置中读取的元素的指针。

最佳答案

您可以使用复合文字。研究复合文字的生命周期,以确保它们在使用时有效。

.values = (int[]){1, 2}

也许我想得太早了,但您的代码示例可能如下所示:

#define ITEM(...)  { \
         .count = sizeof((int[]){__VA_ARGS__})/sizeof(int), \
         .values = (int[]){__VA_ARGS__}, \
     }

struct example_struct items[] = {
    ITEM(1, 2),
    ITEM(10, 20, 30),
    {0},
};

关于c - 在构建时声明指针结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73836990/

相关文章:

c++ - 链接时如何跟踪库的需求?

C# .net Core - 获取磁盘上的文件大小 - 跨平台解决方案

c++ - 防止 gcc 中的 std::function 分配内存或增加阈值

c - 使用 GTK 显示卡片堆需要帮助!

C语法解释

c++ - Debian 上的 qt ./configure

编译时函数 ptr 取消引用

C++ 程序在 Linux 上正确打开文件,但在 Windows 上却不能

c - 不同机器之间的差异是什么意思?

c++ - gcov 不生成覆盖文件