C预处理器 - 用于家庭作业

时间:2009-02-22 04:49:16

标签: c preprocessor

分配:

  

您需要实现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的联机帮助页以了解选项。

     

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

     
      
  1. 删除评论
  2.   
  3. #ifdef#endif
  4.   
  5. #define表示常量(不是宏)
  6.   

3 个答案:

答案 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,则只会包含#endifWINDOWS之间的行。

我希望到现在为止您对程序应该做什么有所了解。

有关实施“最低限度功能”的提示

在这里,我将就如何编写教授所需的最低功能给出一些想法。这些只是我的头脑,所以请先考虑一下。

剥离评论

在阅读输入时,请查找“/*”。当你遇到它时,停止写入输出,然后当你找到“*/”时,你可以再次开始写。使用布尔标志来指示你是否在注释中(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,这可能对你有所帮助。这是相当长的,但大多数都涉及您不需要打扰的选项,因此您可以查看并选择相关部分。