Нет, C++ / CLI не поддерживается под Моно, и вероятное никогда не будет, хотя генерируя чистый IL, который использование компиляторов MS позволило бы полностью управляемому коду выполнять под Моно.
Как interop язык, C++ / CLI существует, чтобы позволить назвать неуправляемый код. Другая альтернатива использует P/Invoke, который является хорошо зарегистрирован хотя с проблемами.
Это возможно, но вам придется выполнить некоторую ручную работу и установить верхний предел.
#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)
, что невозможно с тем, что я показал.
Нет, макросы не могут быть рекурсивными. И макросы, которые вы разместили не являются вариативными, что означает «разное количество параметров».