C препроцессор - для домашней работы


-1

Назначение:

Вы должны реализовать C препроцессор. Препроцессор должен быть реализован как инструмент командной строки, входной файл которого является исходным C-файлом (расширение .c), а выход представляет собой предварительно обработанный файл (расширение .i). Инструмент также имеет несколько вариантов.

$ cppr <options> file.c

При успешной обработке файла .i производится.

< варианта > может быть:

Препроцессора options-
-Aassertion -C -dd -dM -dN -Dmacro [= defn] -E -H
-idirafter реж -include файл -imacros файл
-iprefixfile -iwithprefix реж -М -MD -MM -MMD
-nostdinc -P -Umacro -undef
Каталог options-
-Bprefix -Idir -I-

Внесите любые два из приведенных выше. Это необходимо решить на этапе требований.

Это опции, определенные компилятором GCC. См. Справочную страницу GCC, чтобы понять варианты.

Вы должны выполнять следующие функции, как минимум:

  1. вырезают комментариев
  2. #ifdef и #endif
  3. #define для констант (не макросов)
  0

Вы хотите код или хотите, чтобы мы объяснили вам ваше задание? 22 фев. 092009-02-22 04:59:51

  0

Это не домашний сайт. Пойдите, спросите своего профессора. Если это задание дано, вы достаточно далеко, чтобы вы могли понять назначение и выполнить его. 22 фев. 092009-02-22 05:20:36

+2

По крайней мере, он достаточно честен и просит ссылки для чтения, а не «gimme the codez» 22 фев. 092009-02-22 05:24:17

  0

«givemethecodes» не является полезным тегом @Evan Teran! 23 фев. 092009-02-23 09:59:07

+1

Это должен быть plzsendtehcodez. :-) 24 фев. 092009-02-24 13:44:46

2

Ваш учебник C должен описывать, что andard C препроцессор, но вы также можете попробовать man cpp.

Затем напишите программу для выполнения ограниченного подмножества этих задач (то есть процесса #ifdef/#endif пар и простых #define s).

Ваша программа должна анализировать свою командную строку, принимать по крайней мере две из перечисленных выше опций и обрабатывать их так, как описано в справочной странице gcc.


2

Вот gcc documentation on preprocessor options, который может вам помочь. Это довольно долго, но большинство из них касается вариантов, с которыми вам не нужно беспокоиться, поэтому вы можете просматривать и выбирать соответствующие разделы.


3

Непросто ответить, не зная, что именно вы не понимаете, но я все равно попытаюсь использовать мой очень ограниченный опыт работы на С.

Что такое препроцессор? Препроцессор - это программа, которая выполняет какую-либо обработку файла кода перед его компиляцией.Вы можете, например, определить символическую константу с директивой препроцессора:

#define PI 3.14159 

Затем вы можете использовать это значение с многозначительным названием через код:

area = r * r * PI; 
... 
circumference = 2 * r * PI; 

Что препроцессор делает здесь является заменить все вхождения PI с числовым значением, указано:

area = r * r * 3.14159; 
... 
circumference = 2 * r * 3.14159; 

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

#define WINDOWS 

... 

#ifdef WINDOWS 
    /* do Windows-specific stuff here */ 
#endif 

Линии между #ifdef и #endif будет включен только если константа WINDOWS определяется прежде.

Надеюсь, что к настоящему времени у вас есть представление о том, что должна делать ваша программа.

Советы по реализации «минимальные функции»

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

вырежет комментарии

При чтении входа, обратите внимание на "/*". Когда вы столкнетесь с этим, прекратите запись на выход, затем, когда вы найдете «*/», вы можете начать писать снова. Используйте флаг boolean, чтобы указать, находитесь ли вы внутри комментария (AFAIK, в C нет типа bool, поэтому используйте int с 0 или 1 или, более идеально, две символические константы, такие как INSIDE_COMMENT и OUTSIDE_COMMENT).

#define для констант (не макросов)

Если вы столкнулись с какой-либо строки, начинающиеся с #, очевидно, вы не должны писать его. Если вы найдете директиву #define, сохраните символическое имя и значение где-нибудь (обе строки), и с этого момента найдите имя на входе и выпишите это значение каждый раз, когда оно будет найдено. Вы можете установить максимальную длину для имени константы, это, я думаю, 6 символов в C и всегда проверять 6 символов на входе. Если 6 символов начинаются с известным именем константы, выпишите значение вместо этого.

#ifdef и #endif

Создать логический флаг, чтобы указать, являются ли вы внутри #ifdef, как и с комментариями. Когда вы находите #ifdef, проверьте, если вы уже сохраняете имя константы и записываете на выход в зависимости от этого.

Надеюсь, это поможет.

EDIT: также прочитайте комментарий от gs!

  0

Две вещи: там могут быть вложенные #ifdefs и следить за/*, которые находятся внутри строк, их не следует сопоставлять. 23 фев. 092009-02-23 09:49:37

  0

C99 имеет bool. Полный синтаксис комментариев является мучительным - например, удаляется символ обратной косой черты. Не могу показать это в комментарии, конечно, и вы обычно не пишете такие комментарии. 23 фев. 092009-02-23 15:21:41