Здравствуйте.
Вчера я решил заняться чем-нибудь интересным. Решил разобрать код автора august, созданный в 1985 году для IOCCC. Ниже привожу код:
#define p struct c
#define q struct b
#define h a->a
#define i a->b
#define e i->c
#define o a=(*b->a)(b->b,b->c)
#define s return a;}q*
#define n (d,b)p*b;{q*a;p*c;
#define z(t)(t*)malloc(sizeof(t))
q{int a;p{q*(*a)();int b;p*c;}*b;};q*u n a=z(q);h=d;i=z(p);i->a=u;i->b=d+1;s
v n c=b;do o,b=i;while(!(h%d));i=c;i->a=v;i->b=d;e=b;s
w n o;c=i;i=b;i->a=w;e=z(p);e->a=v;e->b=h;e->c=c;s
t n for(;;)o,main(-h),b=i;}main(b){p*a;if(b>0)a=z(p),h=w,a->c=z(p),a->c->a=u,
a->c->b=2,t(0,a);putchar(b?main(b/2),-b%2+'0':10);}
0.1 Когда я стал его разбирать (на листочке конечно-же), мне стало понять почему мне говорили про кучу define, когда я спрашивал про то, как можно написать работу с длинными числами за 200 символов. Вероятно, написать и правда можно(если обладать фантазией с немалым коэффициентом извращённости).
0.2 Разобрал 2 строки после списка макрозамен, и решил что не серьёзно изучать Си, и не написать для этого программу (тем более, в дальнейшем её можно будет использовать для парсера языка).
1. Я решил, что сначала мне нужно получить список всех
замен (как бы это слово правильно назвать, макроподстановок? ) в тексте. Написал для этого алгоритм. Подскажите пожалуйста, верен ли он ? Или я
что-то/много что упустил.
2. Вероятно, лучше всего хранить список макрозамен в массиве структур. И ещё должна быть переменная, в которой хранится количество записей. Глобальная переменная.
struct mr
{
unsigned i;//номер по порядку, хотя я не уверен в его необходимости
char* identifier = NULL;
char* replacement_list = NULL;
};
...
struct mr* mrl = NULL;
Хотя в этом я не уверен. Правильно ли я думаю ?
3. Согласно стандарту может быть максимум 4095 разных макроидентификаторов?
| ISO/IEC 9899:201x |
|---|
4095 macro identifiers simultaneously defined in one preprocessing translation unit
|
4. Можно ли посмотреть код, полученный после работы препроцессора VS ?
| Модератор: Вложение удалено. |