分配:
您需要实现C预处理器。预处理器将实现为命令行工具,其输入是C源文件(.c扩展名),输出是预处理文件(.i扩展名)。该工具还有几个选项。
$ cppr <options> file.c
成功处理后,会生成.i文件。
&LT;选项&gt;可能是:
预处理器选项 -
-Aassertion -C -dD -dM -dN -Dmacro [= defn] -E -H
-idirafter dir -include file -imacros文件
-iprefixfile -iwithprefix dir -M -MD -MM -MMD
-nostdinc -P -Umacro -undef
目录选项 -
-Bprefix -Idir -I-
实施上述任何两项。这必须在需求阶段决定。
这些是GCC编译器定义的选项。请参阅GCC的联机帮助页以了解选项。
您必须至少实现以下功能:
- 删除评论
#ifdef
和#endif
- 醇>
#define
表示常量(不是宏)
答案 0 :(得分:3)
如果不知道究竟是什么不明白,那么回答并不容易,但我会尝试使用我非常有限的C经验。
什么是预处理器? 预处理器是在编译之前对代码文件进行某种处理的程序。例如,您可以使用预处理程序指令定义符号常量:
#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
之间的行。
我希望到现在为止您对程序应该做什么有所了解。
有关实施“最低限度功能”的提示
在这里,我将就如何编写教授所需的最低功能给出一些想法。这些只是我的头脑,所以请先考虑一下。
剥离评论
在阅读输入时,请查找“/*
”。当你遇到它时,停止写入输出,然后当你找到“*/
”时,你可以再次开始写。使用布尔标志来指示你是否在注释中(AFAIK,C中没有bool类型,所以使用0或1的int,或者更理想的是,使用两个符号常量,如INSIDE_COMMENT
和{{1 }})。
#define for constants(not macros)
如果您遇到以#开头的任何行,显然您不应该写出来。如果找到OUTSIDE_COMMENT
指令,则将符号名称和值存储在某处(两个字符串),然后从中查找输入中的名称,并在每次找到时写出该值。你可以设置常量名称的最大长度,我认为C中有6个字符,并且总是从输入中检查6个字符。如果6个字符以一个已知的常量名开头,请改写该值。
#ifdef和#endif
创建一个布尔标志,指示您是否在#define
内,与评论非常相似。找到#ifdef
时,检查是否已存储常量名称,并根据该值写入输出。
我希望这会有所帮助。
编辑:也阅读了gs的评论!
答案 1 :(得分:2)
您的C教科书应该描述标准C预处理器的功能,但您也可以尝试man cpp
。
然后编写一个程序来执行这些任务的有限子集(即处理#ifdef
/ #endif
对,以及简单#define
s。
您的程序应该解析其命令行,接受上面列出的至少两个选项,并按照gcc
联机帮助页中说明的方式处理它们。
答案 2 :(得分:2)
这是gcc documentation on preprocessor options,这可能对你有所帮助。这是相当长的,但大多数都涉及您不需要打扰的选项,因此您可以查看并选择相关部分。