Я определил несколько макросов, которые упрощают определение массива структур, но я не могу найти способ использовать их без генерации ошибок.Вот макросы (и несколько примеров структур, демонстрирующих, почему макросы могут быть использованы (фактические структуры, которые я заполняю, немного сложнее)):
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
(группа синтаксических ошибок, возникающих в результате его интерпретации как выражения оператора)
ошибка: выражение оператора недопустимо в области видимости файла
Как можно:
- Использовать макрос без ошибок (предпочтительно) или
- Переписать макрос [ы] для работы в этих условиях?