Вызов макроса C++ с меньшим количеством аргументов

Можно ли вызывать макросы, подобные функциям, с меньшими параметрами в Linux? На самом деле это только генерирует предупреждение в Visual Studio (предупреждение 4003), а неназначенные переменные заменяются на «».

Но компиляция его с помощью g++ выдает ошибку в linux ("ошибка: макрос *** требует ** аргументов, но задано только **").

Есть ли способ отключить это или преодолеть это?


person MBZ    schedule 21.07.2010    source источник
comment
Если вы используете C++, вы должны использовать встроенные функции вместо макросов. Фактически, в C++ вам следует избегать использования препроцессора, насколько это возможно.   -  person Dima    schedule 21.07.2010
comment
Ага... если вы используете их для чего угодно, кроме охранников, вы макробатор. ;-)   -  person Amardeep AC9MF    schedule 21.07.2010
comment
В C++ все еще есть несколько ситуаций, когда директивы препроцессора и/или макросы являются единственным решением, например код-оболочка, который должен быть включен в отладочные сборки, но вообще не компилируется в выпускных сборках. Но да, вообще их следует избегать.   -  person Tyler McHenry    schedule 21.07.2010


Ответы (2)


Количество аргументов в вызове макроса должно точно соответствовать количеству параметров в определении макроса. Итак, нет, вы не можете вызвать макрос с меньшим количеством аргументов, чем у него есть параметров.

Чтобы «преодолеть» это, вы можете определить несколько макросов с разными именами и с разным количеством параметров.

C++0x (который еще не является стандартным, но может частично поддерживаться вашим компилятором) добавляет поддержку макросов с переменным числом аргументов, которые можно вызывать с переменным числом аргументов.

person James McNellis    schedule 21.07.2010
comment
GCC уже давно поддерживает вариативные макросы. Я не знаю, работают ли они так же, как в C++0x. Он должен попробовать их gcc.gnu.org/onlinedocs/gcc/Variadic- Macros.html Здесь говорится, что макросы с переменным числом переменных происходят из C99. Разве они не должны быть и на C++? - person asr; 21.07.2010
comment
@asr: макросы Variadic были добавлены в C в C99 (в 1999 г.); текущий стандарт C++ был утвержден в 1998 г. и не содержит вариативных макросов. Они были добавлены в готовящуюся версию C++0x. gcc может поддерживать их при компиляции кода C++, но если и поддерживает, то только как расширение языка или как упреждающую поддержку C++0x. - person James McNellis; 21.07.2010

В стандарте (§16.3 - Замена макросов) ясно, что вы должны передать одинаковое количество аргументов:

«Если список идентификаторов в определении макроса не заканчивается многоточием, количество аргументов (включая аргументы, не состоящие из токенов предварительной обработки) в вызове функционального макроса должно равняться количеству параметров в определении макроса. ."

Я не знаю ни одного варианта g++, чтобы переопределить это.

person Matthew Flaschen    schedule 21.07.2010