Можно ли передать заключенный в скобки инициализатор в качестве параметра макроса?
У меня есть функция, которую я называю так:
literal<long[2]>({1, 2});
Я хочу написать макрос, который расширяется до этого утверждения, например:
MYMACRO(long[2], {1, 2})
К сожалению, препроцессор не знает о сопоставлении скобок, поэтому он видит три аргумента (второй и третий{1
а также2}
соответственно).
Это известное ограничение препроцессора, и наиболее простым решением часто является добавление дополнительных скобок, если возможно, при вызове макроса.
Но в этом случае размещение заключенного в скобки инициализатора в скобках, по-видимому, меняет его значение:
literal<long[2]>(({1, 2}));
(g++ 4.8) error: left operand of comma operator has no effect [-Werror=unused-value]
Это ошибка GCC или исправлена по замыслу? Есть ли способ выполнить то, что я хочу?
ОбновитьЯ, вероятно, должен был быть более ясным в формулировке оригинальных вопросов. Препроцессор не изменился навсегда (даже вариационные макросы долгое время были расширением GCC). Практические обходные пути в этом случае полезны, но они также очень хорошо известны и не до такой степени, до которой я хочу добраться.
Я действительно хочу знать, было ли что-то добавлено в C ++ 11 для конкретного решения этой проблемы (или это было упущением?). Причудливая обработка скобок в вызовах макросов сейчас кажется гораздо более серьезной проблемой, учитывая значительно расширенное использование заключенных в скобки списков по всему языку.
Меня особенно раздражает тот факт, что размещение скобок вокруг заключенного в скобки списка инициализатора изменяет способ его анализа при использовании в качестве параметра функции. Есть ли какой-либо другой параметр для вызова функции, который нельзя заключить в скобки? Это похоже на адский случай при написании макросов, которые передают параметры в функции.
Я действительно надеюсь, что кто-то может указать, что это ошибка GCC, или объяснить, почему заключать скобки в квадратный список инициализаторовдолжен изменить его значение.