Макро-рекурсивное расширение на последовательность

Нет, C++ / CLI не поддерживается под Моно, и вероятное никогда не будет, хотя генерируя чистый IL, который использование компиляторов MS позволило бы полностью управляемому коду выполнять под Моно.

Как interop язык, C++ / CLI существует, чтобы позволить назвать неуправляемый код. Другая альтернатива использует P/Invoke, который является хорошо зарегистрирован хотя с проблемами.

5
задан a3f 31 March 2015 в 01:20
поделиться

2 ответа

Это возможно, но вам придется выполнить некоторую ручную работу и установить верхний предел.

#define BUILD0(x) x[0]
#define BUILD1(x) BUILD0(x), x[1]
#define BUILD2(x) BUILD1(x), x[2]
#define BUILD3(x) BUILD2(x), x[3]
#define BUILD(x, i) BUILD##i(x)

И обратите внимание, что i должен быть целочисленным литералом, а не постоянным вычисляемым значением.

Кстати, препроцессор более мощный, чем обычно, но использовать эту мощность довольно сложно. Boost предоставляет библиотеку, которая упрощает некоторые вещи, включая итерацию. См. Библиотека препроцессора Boost . Есть еще одна библиотека для таких вещей, но ее название сейчас ускользает от меня.

Редактировать: Библиотека препроцессора boost использует похожую технику. С дополнительными приемами для решения некоторых краевых проблем, совместного использования макросов реализации между объектами более высокого уровня, работы над ошибками компилятора и т. Д. обычная сложность повышения, которая нормальна в контексте библиотеки общего назначения, но иногда мешает легкому пониманию принципов реализации. Вероятно, самый заметный трюк - добавить уровень косвенного обращения, чтобы, если второй параметр может быть макросом, он расширялся. Т.е. с

#define BUILD_(x, i) BUILD##i(x)
#define BUILD(x, i) BUILD_(x, i)

можно сделать вызов

#define FOO 42
BUILD(x, FOO)

, что невозможно с тем, что я показал.

14
ответ дан 18 December 2019 в 10:47
поделиться

Нет, макросы не могут быть рекурсивными. И макросы, которые вы разместили не являются вариативными, что означает «разное количество параметров».

2
ответ дан 18 December 2019 в 10:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: