Иногда я намеренно опускать аргументы макроса. Например, для макроса, подобного функции
#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_)