Язык программирования Си


         

Разработайте простую версию препроцессора для


- 329 - Си в UNIX

7.60. Разработайте простую версию препроцессора для обработки операторов #include. В качестве прототипа такой программы можно рассматривать такую (она понимает дирек- тивы вида #include имяфайла - без <> или "").

#include <stdio.h> #include <string.h> #include <errno.h>

char KEYWORD[] = "#include "; /* with a trailing space char */

void process(char *name, char *from){ FILE *fp; char buf[4096];

if((fp = fopen(name, "r")) == NULL){ fprintf(stderr, "%s: cannot read \"%s\", %s\n", from, name, strerror(errno)); return; } while(fgets(buf, sizeof buf, fp) != NULL){ if(!strncmp(buf, KEYWORD, sizeof KEYWORD - 1)){ char *s;

if((s = strchr(buf, '\n')) != NULL) *s = '\0'; fprintf(stderr, "%s: including %s\n", name, s = buf + sizeof KEYWORD - 1); process(s, name); } else fputs(buf, stdout); } fclose(fp); } int main(int ac, char *av[]){ int i;

for(i=1; i < ac; i++) process(av[i], "MAIN"); return 0; }

7.61. Разработайте простую версию препроцессора для обработки операторов #define. Сначала реализуйте макросы без аргументов. Напишите обработчик макросов вида

#macro имя(аргу,менты) тело макроса - можно несколько строк #endm

7.62. Напишите программу, обрабатывающую определения #ifdef, #else, #endif. Учтите, что эти директивы могут быть вложенными:

#ifdef A # ifdef B ... /* defined(A) && defined(B) */ # endif /*B*/ ... /* defined(A) */ #else /*not A*/ ... /* !defined(A) */ # ifdef C ... /* !defined(A) && defined(C) */ # endif /*C*/



Содержание  Назад  Вперед