命令行参数分析
我们在实验中使用的 Code::Blocks 只是一种集成开发环境(IDE), 它本身要依赖 gcc 编译器才能对编写的 C 语言程序进行 预处理 (preprocess)、编译 (compile) 和 链接 (link). 还要依赖 gdb 调试器才能对编译好的可执行程序进行调试 (debug).
事实上, 在程序写好之后, 我们完全可以脱离 Code::Blocks 的束缚, 直接同 gcc 打交道来让程序工作. 例如, 有如下 C 程序 (hello.c):
#include int main(void){ printf("Hello World!\n"); return 0;}则可以用下面的命令来从 hello.c 源文件得到 hello.exe 可执行程序. 这一过程中 gcc 同时起到预处理器、编译器和链接器的功能.
$ gcc -o hello.exe hello.c我们也可以仅对一个源程序做预处理 (对 hello.c 做预处理, 结果存为 expanded.c) 此时 gcc 只起预处理器的作用:
$ gcc -E -o expanded.c hello.c或者仅对一个源程序做编译 (对 hello.c 做预处理和编译, 生成目标文件 hello.o) , 此时 gcc 起预处理器和编译器的作用:
$ gcc -c -o hello.o hello.c从 .c 文件生成可执行程序时, gcc 还允许我们不指定输出文件的名字, 例如:
$ gcc hello.c 这条命令相当于 gcc -o a.exe hello.c
最后 gcc 还提供了一个帮助功能, 显示所有支持的参数
$ gcc --help在这次上机作业中, 我们编写程序来分析拟传递给 gcc 的命令行参数, 判定其将会执行的功能.
输入
一般地, 一个 (在本问题的上下文中经过充分简化后的) 完整的 gcc 命令行, 可能呈现为以下两种形式:
gcc [options] gcc --help第一种形式中, options 的内容可以是下表中的任意一个和若干个的组合(保证同一种 option 不会重复出现):
命令行参数的形式 含义
-std= 执行的 C 语言规范 ( 可能是 c89 或者 c99), 本参数可以省略, 默认为 c89
-E 仅执行预处理
-c 仅执行预处理和编译
-o 指定输出文件名, 如果当前任务是生成可执行程序, 则本参数可以省略(此时 默认为 'a.exe' 其它情况下没有默认输出文件名)
命令中所有涉及到的文件名都保证仅含小写字母、数字、下划线 ('_') 和英文句号 ('.'), 文件名长度不超过 100 字符.
gcc 命令的不同 options 之间, 以及 -o 参数的 -o 和文件名之间, 都保证有至少一个空格. -std= 参数和C语言标准之间没有空格
输入数据中的每个 gcc 命令都保证合法, 其长度不超过 1000 字符. EOF标志输入结束.
输出
对于输入的每个 gcc 命令行, 输出对其功能的判定. 后跟一换行符 (参见输出样例). 每行的长度不会超过1000字符.
输入样例
gcc hello.cgcc -c -o hello.o hello.cgcc -std=c99 -o foobar.c -E hello.cgcc --help输出样例
I am a c89 preprocessor + compiler + linker. I start from "hello.c" and end with "a.exe".I am a c89 preprocessor + compiler. I start from "hello.c" and end with "hello.o".I am a c99 preprocessor. I start from "hello.c" and end with "foobar.c".I am showing help.
--------------------------------------------------------------------------------
注1:以上对gcc的描述是真实的。你可以在命令行试验一下。在“开始”菜单中运行“命令提示符”,黑窗口中输入“set path=%PATH%;C:\MinGW\bin”,然后便可以使用gcc命令。红字部分请根据机器编译器的安装目录适当调整。
注2:本次作业试行“人性化自动评判”,根据输出错误的行数自动给分。教师手工评判只处理风格分和不用函数、使用goto、使用全局变量的扣分。
注3:这里介绍的库函数可以给你带来很多帮助。
--------------------next---------------------
阅读(1134) | 评论(0) | 转发(0) |