[英]Generate nested constant arrays in C at compile time
我試圖在 C (C99) 編譯時生成一個大的常量查找表,並且查找表的每個條目都有一個指向另一個常量數組的指針。 我希望能夠一次構建所有這些數組,但這是不可能的,因為大括號初始化器不能用於指針。 是否有一些預處理器宏或其他技巧可以用來定義“匿名”數組或類似的東西,以便我可以將它們包含在嵌套數據結構中?
我在下面創建了一個示例,顯示了我目前正在做的事情以及我正在嘗試做的事情。
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}},
};
更新:多虧了下面的答案,我已經找到了一個解決方案。 使用 varadic 宏,我什至可以顯式地輸入大小:
#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)}
};
您需要創建對象,並且指向該對象的指針必須是該字段的初始值設定項。 您可以使用復合文字將其存檔
const colour_preferences_t array_of_preferences_invalid[3] = {
{"Bob", 2, ( const colours_t[]){RED, GREEN}},
{"Alice", 3, (const colours_t[]){BLUE, PURPLE, YELLOW}},
{"Eve", 1, (const colours_t[]){YELLOW, RED}},
};
它應該使用像這樣的復合文字:
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}},
};
您可以在此處閱讀有關復合文字的詳細信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.