在编译时在C中生成嵌套常量数组

问题描述 投票:1回答:2

我正在尝试在C(C99)编译时生成一个大的常量查找表,并且该查找表的每个条目都有一个指向另一个const数组的指针。我希望能够一次构建所有这些数组,但这是不可能的,因为大括号初始化程序不能用于指针。是否可以使用一些预处理程序宏或其他技巧来定义“匿名”数组或类似的东西,以便可以将它们包括在嵌套数据结构中?

我在下面创建了一个示例,显示了我当前正在做的事情,以及我正在尝试做的事情。

typedef enum {
    RED = 0,
    GREEN,
    BLUE,
    PURPLE,
    YELLOW
} colours_t;

typedef struct {
    const char *name;

    const size_t number_of_preferences;
    const colours_t *ordered_preferences;
} colour_preferences_t;


// this way works, but is tedious
const colours_t bob_preferences[] = {RED, GREEN};
const colours_t alice_preferences[] = {BLUE, PURPLE, YELLOW};
const colours_t eve_preferences[] = {YELLOW, RED};

const colour_preferences_t array_of_preferences[3] = {
        {"Bob", 2, bob_preferences},
        {"Alice", 3, alice_preferences},
        {"Eve", 2, eve_preferences}
};


// this is how I'd like to do it (but it isn't valid)
const colour_preferences_t array_of_preferences_invalid[3] = {
        {"Bob", 2, {RED, GREEN}},
        {"Alice", 3, {BLUE, PURPLE, YELLOW}},
        {"Eve", 1, {YELLOW, RED}},
};

更新:由于下面的回答,我制定了一个解决方案。并使用等宽宏,甚至可以删除输入的大小:

#define PREFERENCE_LIST(...) sizeof((colours_t[]) { __VA_ARGS__ })/sizeof(colours_t), (colours_t[]){ __VA_ARGS__ }

const colour_preferences_t array_of_preferences_short[3] = {
        {"Bob", PREFERENCE_LIST(RED, GREEN)},
        {"Alice", PREFERENCE_LIST(BLUE, PURPLE, YELLOW)},
        {"Eve", PREFERENCE_LIST(YELLOW, RED)}
};
c c99
2个回答
3
投票

它应该使用这样的复合文字:

const colour_preferences_t array_of_preferences_invalid[3] = {
        {"Bob", 2, (colours_t[]){RED, GREEN}},
        {"Alice", 3, (colours_t[]){BLUE, PURPLE, YELLOW}},
        {"Eve", 1, (colours_t[]){YELLOW, RED}},
};

您可以阅读有关复合文字here的详细信息>


3
投票

您需要创建对象,并且指向该对象的指针必须是该字段的初始化程序。您可以使用复合文字

© www.soinside.com 2019 - 2024. All rights reserved.