Я иногда намеренно опускаю аргументы макроса. Например, для макроса, подобного функции, типа
#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<typename T>
, поэтому я опускаю этот аргумент макроса:
IMPLEMENT_ACCESORS(, int, MyClass, Int, int_)