Уловка: заполнение значений массива с помощью макросов (генерация кода)

Шаблоны C ++ - это просто замаскированные макросы?

Я читал вышеупомянутую тему, и внезапно мне пришла в голову идея: почему бы не попробовать написать несколько сложных макросов, которые можно было бы использовать в нашем реальном коде (не только как головоломки, которые бесполезны в реальной жизни)?

Итак, первое, что пришло в голову: заполнение значений массива макросами:

int f(int &i) { return ++i; }

#define e100     r5(m20)
#define m20      m5,m5,m5,m5
#define m5       r5(e1)
#define e1       f(i)  //avoiding ++i right here, to avoid UB!
#define r5(e)    e,e,e,e,e

int main() {
        int i=0;           //this is used in the macro e1
        int a[] = {e100};  //filling array values with macros!
        int n  = sizeof(a)/sizeof(int);
        cout << "count = " << n << endl;
        for(int i = 0 ; i < n ; i++ ) 
            cout << a[i] << endl;
        return 0;
}

Вывод:

count = 100
1
2
3
4
.
.
.
100

Онлайн-демонстрация: http://www.ideone.com/nUYrq

Можем ли мы улучшить это решение с точки зрения компактности или универсальности (возможно и того, и другого)? Можем ли мы избавиться от переменной i , которая нам нужна в макросе? Или любое другое улучшение?

Я также хотел бы знать, является ли это допустимым кодом как на C ++, так и на C (конечно, игнорируя часть печати)?

РЕДАКТИРОВАТЬ:

Я понял, что порядок обращений к f () кажется все еще неуказанным . Я не уверен, так как я думаю, что запятая в инициализации массива , а не , вероятно, такая же, как оператор запятой (в общем). Но если это так, можем ли мы этого избежать, и в какой части Стандарта говорится, что это неопределенное ?

11
задан Community 23 May 2017 в 11:44
поделиться