2008年4月7日星期一

恐龙级程序员的编程技巧

前些天接到用户电邮,抱怨我们公司的软件所产生的C语言代码无法编译使用。看了一下他提供的出错信息,居然是说CrtMain的入口找不到。这不禁让我觉 得好笑,因为我所参与开发的这个软件的确有产生代码的功能,但只是一个函数的代码,而不是整个可执行的程序,没有C语言所必需的main()函数,怎么可 以执行?看这位用户的名字,应该也是身在海外的华人。我因为本身交友圈子的局限,认为现在在海外的中国人都是会编程的,如同以前中国人靠3把刀谋生一样。 将这个当笑话讲给同事听,不料,同事却说:这说明你已经成了恐龙了,现在谁还会用C语言编程?java,.Net的程序员才不会在乎这个main呢。这让 我笑不出来了。

我开始工作时开发平台是Sun4(那时SPARC工作站还没有问世)+C语言(C++也根本没有成熟),写程序用的是vi(这我倒是一直使用到现在,成了 gvim)编辑器,老前辈说:这还算好的,要知道以前的ed,只能编辑一行啊。颇有些忆苦思甜的味道。调试环境只有一个终端可以输入命令,虽说程序出错后 会有Core被吐出来,但只有牛人看得懂这个Core里有什么东西,我可没有到这个级别。所以只有狂加打印语句,看程序在什么地方死掉。用标准输入输出出 错的方式,以及怎样连接各条命令,让他们管道相通,还有如何用tee只截取出错打印的信息等等。但有时候打印也不行,因为加了几句打印会使得原来出错的地 方消失,只好再猜测到底哪里可能出错。

时过境迁,在微软几乎一统天下的情况下不得不在Windows上编程。一下子还真适应不过来:远程窗口执行没有了,远程终端不行,窗口的程序打印语句看不 到。但程序员就是只有使用可以使用的工具的命,多年下来,居然也习惯了微软的一套规矩,终于把Win32 SDK编程学会了。可是,还是不断的有新的技术语言出现,这些新概念如此之多以至于要让我放弃去学习新知识的努力,学会用大胡子同事的怀疑眼光看待一切新 事物:所谓新技术只是那些大公司的阴谋,来折腾我们这些被划入恐龙级别的程序员的。

的确,当时用UNIX的时候学到那些老的编程哲学,要简洁明快,尽量让别人看不懂。这倒也迫使我学会了不少技巧和冷门知识,如使用awk,yacc, lex,makefile等。但到了现在,都成了过时的东西,看来早晚C程序员要被微软逼迫关到管理内存空间里去。不过微软很多地方是借鉴了UNIX,但 就是不将这些技巧写入文档,方便大家使用。我在工作空闲的时候(比如等待编译完成),在网上搜索,找到了一些我认为有用,但却是没有人在乎的小技巧。事实 上我也不常使用,不过为了避免遗忘,还是记下来的好。

比如,在窗口应用程序中使用打印语句,有如下的办法:

只要在程序初始化时加入:
AllocConsole();
freopen("CONOUT$", "wb", stdout);

然后可以写一句试试:
printf("TEST n " ) ;

别忘了结束时的处理:
fclose(stdout);
FreeConsole();

就这么简单。

1 条评论:

WANGHU 说...

评论源自: 逸立
看吧,马上就要核大战了。等毁完旧世界之后,新的世界就将在咱这穿孔一代手中再生。
06-03-01 @ 22:17

评论源自: WANGHU
偶还是去学打算盘吧。
06-03-02 @ 07:18

评论源自: 游主任
偶第一次编程用的语言是Algol 60,介质是五孔纸带。
06-03-02 @ 10:47

评论源自: WANGHU
好啦好啦,也就差这一两年了。
06-03-02 @ 14:29

评论源自: 崴跛司机
Matrix - Reloaded...

BTW,王老虎,我们公司要把一些超任上的游戏如魂斗罗之类的移植到XBOX360上(高清晰版),那是很有趣的一件事,不知道你有啥游戏想重温哪?俺可以和那些Producer们唠嗑唠嗑。 :-)
06-03-03 @ 22:40

评论源自: 崴跛司机
另外,你还别说,今天一个同事就问俺MFC下的Printf打印到哪里去了,咋看不到捏,俺让他先去搜索MSDN去,活活,下礼拜再让他看你的博客文章,嘿嘿
06-03-03 @ 22:44

评论源自: WANGHU
不一定啊,想当年看到波斯王子变成3维的了,结果还是怀念最早的1和2。

一个时代的游戏只能活在那个时代,倒是把这些游戏移到手机上还有些意思。

360上应该有和它硬件相符合的游戏,据我看,还不够有吸引了。
06-03-04 @ 08:00

评论源自: WANGHU
这种雕虫小技,不足挂齿。你去读CodeProject里,有趣的东西也不少。比如,写个窗口程序,一个窗口键入DIR,另一个窗口将结果显示出来,怎么做? :)

偶只懂Win32SDK编程,对MFC只知其一,不知其二,这样也好,看M$让MFC安乐死,偶可以直接从.Net入手了。
06-03-04 @ 08:03