计算机二级c语言复习:预处理与宏
预处理与宏:Ansi C和常见的宏汇编都有自己的预处理宏系统,其实两方我都建议可以用其他的比如m4之类的的工具,出于某些特定的需求的话。当你意识到生成编译或者汇编代码之前都是文本处理的时候,两种语言的区别就会在一个很清澈的层面展示出来。我曾经做过这样的事情,为了调用一个C++写的虚成员,当然也许不是最好的实现,不过当时是一个只有C而且不能链接外部静态库的实现:

|
#define Thiscall(...) do{ \
__asm__("push %ecx\n\tmov __cxxpThis, %ecx"); \ __VA_ARGS__; \ __asm__("pop %ecx"); }while(0) #define this(var) do{ \ void *ptmpthis = __cxxpThis;\ __cxxpThis = var; \ #define __call(...) \ Thiscall(__VA_ARGS__); \ __cxxpThis = ptmpthis; }while(0) 然后这个设施就形成了 int (__stdcall *vmember)(); *(int *)&vmember = (int *)(*(int *)ppInput->ppThis)[2];//这两行的vmember, this和2仍然可以写成宏 this(ppInput->ppThis)__call(retv = vmember( filename ) ); |
如果是宏汇编,你会怎么做呢?如果你的编译器将thiscall当作其他的传参方式,面对这个程序还是要mov
当然这里用了变量保存ecx不太好,习惯上可以用esi来保存ecx的值,这里宏汇编可以用自定义宏写出很短的代码,C也可以,相比之下,我不认为宏汇编家应该拿向C或者其他高级语言学的东西来表明宏汇编比C更好。
毕竟PC上我们在Ring3编程的话,C风格的系统调用才是底层,其他的都只能算是调用他们的实用代码。在其他方面比如嵌入式的系统,我不知道是怎样的,不过我觉得C仍然会是主要和通用的语言,有人可能会认为嵌入式对时间空间要求比较严格,因此比较相信手写汇编代码,我只好说,编译器对某些特定情景的优化比手动优化的还好,就算编译器一时不能实现某种优化,那么我们仍然可以从语言以外的东西出发,例如gcc工具链的链接脚本。而且我并不是说只能用一种语言,完全可以让效率的部分用纯汇编来写,而构架的部分用C来调用,C是一种粘合性的中间语言,缺少了汇编语言,仍然可以用C去实作目的机器的机器码,而缺少了C和C的一系列标准、约定和惯例,汇编和高级语言(如嵌入式平台的Java)的连接就未必能这么方便,从这个意义上,C才是最基础和最通用的语言。
另外BOOST::PreProcessor还是很不错的,个人觉得,它不仅仅是C++中有用(也可以说C++正常的用法可能用不到他),B.Stroustrup大牛也说过C的预处理和宏机制,应该慢慢从C++中淡化,成为独立于语言的一部分。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/1062.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
