-1

任务:

您需要实现 C 预处理器。预处理器将作为命令行工具实现,其输入是 C 源文件(.c 扩展名),输出是预处理文件(.i 扩展名)。该工具也有几个选项。

$ cppr <options> file.c

成功处理后,将生成文件 .i。

<选项> 可能是:

预处理器选项
- -Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H
-idirafter dir -include 文件 -imacros 文件
-iprefixfile -iwithprefix dir -M -MD -MM -MMD
-nostdinc –P - Umacro –undef
目录选项
--Bprefix -Idir -I-

实现以上任意两项。这必须在需求阶段确定。

这些是 GCC 编译器定义的选项。请参阅 GCC 的手册页以了解这些选项。

您必须至少实现以下功能:

  1. 剥离评论
  2. #ifdef#endif
  3. #define对于常量(不是宏)
4

3 回答 3

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和之间的行。#endifWINDOWS

我希望现在你对你的程序应该做什么有了一些想法。

实现“最小功能”的提示

在这里,我将为您提供一些关于如何编写教授所需的最低功能的想法。这些只是我的想法,所以请先考虑一下。

剥离评论

在阅读输入时,寻找“ /*”。当你遇到它时,停止写入输出,然后当你找到“ */”时,你可以重新开始写入。使用布尔标志来指示您是否在注释中(AFAIK,C 中没有 bool 类型,因此请使用带有 0 或 1 的 int,或者更理想的是使用两个符号常量,如INSIDE_COMMENTOUTSIDE_COMMENT)。

#define 用于常量(不是宏)

如果你遇到任何以#开头的行,显然你不应该把它写出来。如果找到#define指令,请将符号名称和值存储在某处(两个字符串),然后在输入中查找名称,并在每次找到时写出值。您可以为常量名称设置最大长度,我认为这是 C 中的 6 个字符,并且始终从输入中检查 6 个字符。如果这 6 个字符以已知常量名称开头,则改为写出该值。

#ifdef 和 #endif

创建一个布尔标志来指示您是否在 内部#ifdef,就像注释一样。查找时#ifdef,检查您是否已经存储了常量名称,并根据该名称写入输出。

我希望这有帮助。

编辑:还阅读 gs 的评论!

于 2009-02-23T09:22:50.617 回答
2

您的 C 教科书应该描述标准 C 预处理器的功能,但您也可以尝试man cpp.

然后编写一个程序来执行这些任务的有限子集(即进程#ifdef/#endif对和简单#define的s)。

你的程序应该解析它的命令行,至少接受上面列出的两个选项,并按照gcc手册页中解释的方式处理它们。

于 2009-02-22T04:56:10.453 回答
2

这是有关预处理器选项的 gcc 文档,可能对您有所帮助。它相当长,但其中大部分涉及您不需要打扰的选项,因此您可以浏览并挑选相关部分。

于 2009-02-22T04:56:31.980 回答