Допустимы ли пустые аргументы макроса в C ++ 11?

Иногда я намеренно опускать аргументы макроса. Например, для макроса, подобного функции

#define MY_MACRO(A, B, C)  ...

, я мог бы назвать его так:

MY_MACRO(, bar, baz)

Технически все еще есть 3 аргумента; просто первая "пустая". Этот вопрос не о макросах с переменным числом аргументов.

Когда я это делаю, я получаю предупреждения от g ++ при компиляции с помощью -ansi (также известного как -std = c ++ 98 ), но не когда я использую -std = c ++ 0x .Означает ли это, что пустые аргументы макроса допустимы в новом стандарте C ++?

Это мой вопрос в целом, но я предвосхищаю "зачем вам это нужно?" ответ, вот пример. Мне нравится не загромождать файлы .h телами функций, но реализация простых средств доступа вне файла .h утомительна. Поэтому я написал следующий макрос:

#define IMPLEMENT_ACCESSORS(TEMPLATE_DECL, RETURN_TYPE, CLASS, FUNCTION, MEMBER) \
  TEMPLATE_DECL                                                         \
  inline RETURN_TYPE* CLASS::Mutable##FUNCTION() {                      \
    return &MEMBER;                                                     \
  }                                                                     \
                                                                        \
  TEMPLATE_DECL                                                         \
  inline const RETURN_TYPE& CLASS::FUNCTION() const {                   \
    return MEMBER;                                                      \
  }

Вот как я бы использовал его для шаблона класса, который содержит int с именем int_ :

IMPLEMENT_ACCESSORS(template<typename T>, int, MyTemplate<T>, Int, int_)

Для нешаблонного класса, Мне не нужен template , поэтому я опускаю этот аргумент макроса:

IMPLEMENT_ACCESORS(, int, MyClass, Int, int_)
25
задан rubenvb 6 October 2011 в 12:09
поделиться