简单定义下程序变换:
在不改变功能(输入输出的对应关系)情况下,将程序改变成另一种形式表达。
可以看出,程序变换,是一种函数的等价变换。
广泛意义看来,所有编译都是变换。
那么,将C++程序转成C的思路,就是针对C++的表达语法,C中没有的或不同语义的,找出相应的等价变换。
略微分析一些,如下:
// 转struct
struct x {...}; // c++
->
typedef struct tag_x{...} x; // c
// 转类
设类为:
class x { ... };
对于只会用一个实例对象的类,比较容易:
成员变量 v -> static s_v;
成员函数 f -> x_f // 增加类名作为前缀
对于会创建多个实例的类,麻烦一些:
先创建 struct x_s { ... } 将成员变量都封装在结构里面
增加类型:typedef x_s * x_handle;
创建函数:x_handle x_init(...);
析构函数:void x_down(x_handle h);
公共函数:f(...) -> x_f(x_handle h, ...);
私有函数:f(...) -> static xs_f(x_handle h, ...);
// 其他
其他诸如变量说明,以及函数重载,模板等,大家找出合理的命名规则,转换步骤,都是可以的。
有朋友也许会问:
怎么不用工具转换呢?
应该来说,早期的C++是先编译成C再进行编译成抽象机中间代码的。不过,那些都是给编译器看的C符号,人看不惯。要有可维护性,估计现在还只能人来干。
#