Я хочу написать макрос на C, который принимает любое количество параметров, а не конкретное число
пример:
#define macro( X ) something_complicated( whatever( X ) )
где X
любое количество параметров
Мне это нужно, потому что whatever
он перегружен и может вызываться с 2 или 4 параметрами.
Я попытался определить макрос дважды, но второе определение переписало первое!
Компилятор, с которым я работаю, это g ++ (точнее, mingw)
c
g++
c-preprocessor
variadic
Hasen
источник
источник
Ответы:
Способ C99, также поддерживается компилятором VC ++.
источник
##
не нужен и не переносим.#define FOO(...) printf(__VA_ARGS__)
делает работу переносным способом;fmt
параметр может быть опущен из определения.__VA_ARGS__
это стандартный способ сделать это. Не используйте специфичные для компилятора хаки, если вам это не нужно.Я действительно раздражен тем, что не могу комментировать исходное сообщение. В любом случае, C ++ не является надмножеством C. Это действительно глупо компилировать ваш код C с помощью компилятора C ++. Не делай то, что не делает Донни.
источник
class
сklass
для возможности осуществления компиляции с компилятором C ++. Также обратите внимание, что есть некоторые отличия, которые могут сбить вас с толку; например, троичный оператор не оценивается одинаково в обоих языках, аinline
ключевое слово означает что-то совершенно другое (как я узнал из другого вопроса).Я не думаю, что это возможно, вы могли бы подделать это с двойным пареном ... до тех пор, пока вам не нужны индивидуальные аргументы.
источник
Если компилятор не понимает переменные макросы, вы также можете удалить PRINT одним из следующих способов:
или
Первый комментирует инструкции PRINT, второй запрещает инструкцию PRINT из-за условия NULL if. Если оптимизация установлена, компилятор должен удалить никогда не выполненные инструкции, такие как: if (0) print ("hello world"); или ((недействительно) 0);
источник
if
версия «не делай этого», которая учитывает структуру кода:if (0) { your_code } else
точка с запятой после того, как расширение макроса завершаетelse
. Вwhile
версии выглядит следующим образом :while(0) { your_code }
Проблема сdo..while
версией является то , что код вdo { your_code } while (0)
делаются один раз, гарантирован. Во всех трех случаях, еслиyour_code
пусто, это правильноdo nothing gracefully
.объяснил для g ++ здесь, хотя это часть C99, поэтому должно работать для всех
http://www.delorie.com/gnu/docs/gcc/gcc_44.html
быстрый пример:
источник
__VA_ARGS__
, хотя они поддерживаются компиляторами и в более ранних версиях, как расширение.