Я определил несколько макросов, которые упрощают определение массива структур, но я не могу найти способ использовать их без возникновения ошибок. Вот макросы (и несколько примеров структуры, чтобы показать, почему макросы могут быть использованы (фактические структуры, которые я заполняю, немного сложнее)):
struct string_holder {
const char *string;
};
struct string_array_holder {
struct string_holder *holders;
};
#define DEFINE_STRING_ARRAY_HOLDER(name, values) \
static struct string_holder name##__array[] = values; \
static struct string_array_holder name = { name##__array }
#define WRAP_STRING(string) { string }
Он отлично работает, когда вы используете его для объявления массива с одним элементом:
DEFINE_STRING_ARRAY_HOLDER(my_string_array_holder, {
WRAP_STRING("my string")
});
Но когда я использую несколько элементов:
DEFINE_STRING_ARRAY_HOLDER(my_string_array_holder, {
WRAP_STRING("hello"),
WRAP_STRING("world")
});
Я получаю эту ошибку:
ошибка: слишком много аргументов, предоставляемых функционально подобранному вызову макросов
Поэтому он интерпретирует запятую в фигурных скобках как разделитель аргументов. Я следую советам этого вопроса и поставлю круглые скобки вокруг проблемного аргумента:
DEFINE_STRING_ARRAY_HOLDER(my_string_array_holder, ({
WRAP_STRING("hello"),
WRAP_STRING("world")
}));
Теперь, когда я пытаюсь скомпилировать его, он интерпретирует ({ ... })
как выражение выражения и жалуется:
предупреждение: использование выражения выражения выражения GNU
(куча синтаксических ошибок, возникающих в результате его интерпретации как выражение оператора)
ошибка: выражение оператора не допускается в области видимости файла
Как я могу:
- Используйте макрос без ошибок (предпочтительно) или
- Перепишите макрос [s], чтобы работать в этих обстоятельствах?