У меня следующая проблема - задано переменное количество аргументов макроса argX для создания списка строковых аргументов #argX
Пример:
LIST(A, B) -> "A", "B"
LIST(A, B, C) -> "A", "B", "C"
Я использую Boost, поэтому приведенный выше макрос не так уж сложно реализовать с помощью вспомогательных макросов для каждого количества аргументов и отправки LIST(...) в соответствующий LIST_n(arg1, ... argn).
Проблема начинается, когда входные данные для LIST сами являются макросами. В этом случае (если я использую ... и __VA_ARGS__) макросы расширяются до того, как они будут преобразованы в строку, что дает:
#define A 10
LIST(A, B) -> "10", "B"
Я хочу, чтобы это работало с макросами, определенными в заголовках Windows, и большинство значений там являются макросами (MB_OK, AF_INET, ...), поэтому все, что я получаю, это список строковых чисел.
Когда __VA_ARGS__ не используется, все работает нормально:
#define A 10
#define LIST_1(arg0) #arg0
LIST_1(A) -> "A"
Я пробовал несколько макросов, которые откладывают раскрытие __VA_ARGS__ на более позднее время (например, до LIST_1, в котором нет переменных), но ничего не сработало.
Возможно ли это реализовать с помощью препроцессора C?