之后要判断字符串是否结束,如果未结束,则判断字符是否为’.’,因为我们如果在命令行输入的参数是XXX.c,那么tcc时后面加XXX.c是正确的,但是在tlink语句里面加XXX.c是错误的,应该用XXX或者XXX.obj,为了简便我们就使用名字。然后将“.”改成转义字符“\0”表示字符串已经结束。
之后再用strcat将tlink连接语句拼接好用system执行。
执行结果如下:
如果不输入文件名则提示错误。如果输入则正确编译连接。运行编译连接生成的exe文件如图:
先在屏幕中间显示显示彩色字符串,再执行CMain函数“welcome to c”,输出字符串“hello world!”。
二、扩展研究(1)为什么main函数的参数是参数的个数和命令行参数字符串?
答:我认为是参数是在程序跳转到main函数之前初始化时将命令行的参数的字符串地址传递到栈里,再在main函数里通过栈调用。
三、研究总结今天我们自己基于tcc、tlink实现了一个编译连接工具cc,它的功能与tcc相似,都是编译连接程序,只是多出了显示欢迎字符串和等待输入再执行程序的功能。向下看,其本质还是tcc的功能,我们并没有真正地实现一个编译器和连接器,向上看,这个程序的实现是一个不断集成的过程,再加上别的功能的obj文件可以组合成更大更丰富的程序。
这一章对共性和个性的分离和封装更加清晰了:共性被封装在编译工具里,个性由要编译的程序实现,按照这个思路,我们可以开发出功能更强大的编译连接工具。
这一张我觉得学习了一个很重要的函数system,我们可以通过程序来调用操作系统的功能,它与我们传统的思维是不同的,我觉得操作系统打开软件执行,软件实现功能后返回操作系统,而这里软件可以调用操作系统的功能,这使我们写的程序可以实现更强大的功能。这种操作是由顶层向底层的调用。