将CPP文件移植成C文件方法和注意的问题

一:将类转换为结构体

第一步:将类当中的所有变量转换为结构体变量(结构体变量公有访问)
// 映射点
class CMappingPoint
{
public:
    __int64        m_nCoordinate;            // 
    __int64        m_nMeasurement;            //
};
转换后
typedef struct MappingPoint
{
    __int64        m_nCoordinate;            // 
    __int64        m_nMeasurement;            // 
}CMappingPoint;

第二步:将所有的成员函数转换为全局函数,为每一个函数添加指向此类转换后结构体的指针的形参,方便访问此结构体当中变量。
// 直线轴摩擦补偿
Class CFrictCompensation
{
CFrictCompensation( void ){ memset( this, 0, sizeof *this ); }
    void Reset( void );    
    int Mapping( int nIncrement );    
};

//  初使化构造
Void FrictCompensation_InitFrictCompensation(CFrictCompensation *_This);
// 回零后调用(而后才能进行补偿 。。。)
void FrictCompensation_Reset( CFrictCompensation *_This );
// 输入脉冲增量(nm),输出实际的增量(nm)
int FrictCompensation_Mapping( CFrictCompensation *_This, int nIncrement );

注意:有些成员函数是常函数,也就是只读函数,其主要特点是不会修改成员变量的值,由于在C语言当中不存在常函数概念,移植的时候去掉这个属性。
Class{
void Lookup ( __int64 * pMeasurement, const __int64& nCoordinate ) const;
}
修改后
void Lookup ( __int64 * pMeasurement, const __int64& nCoordinate );

如果存在构造和析构函数,注意需要人为进行调用,注意构造与析构的顺序。C语言不中不会自动初使化。

二:关键字

Operator:
重载操作符,现在只能理解为类的一此比较,比如比较两个类是否相等(==),或者把两个类进行相加(+),主要是对类成员变量的操作。其次比如定义一个类时,返回时运用Operator重载为其它类型或结构体(Pungo/Socke.cpp/Socket_t类)。
C语言当中不存这个关键字,去掉。留意使用它的目的是什么。可能有的地方断言会用到,会报错。

Mutalbe:
C++中用它定义的变量表示可变的易变的,即使在常函数当中也可修改。作用与const相反。
C语言当中不存这个关键字,去掉。

static_cast:
(1)用于基本数据类型之间的转换    如把int转换成char,把int转换成enum
(2)用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换 。    static_cast< int > 此关键字只能在有相互联系的类型中相互转换(class CDeviceState : public CDeviceIo)。不一定包含虚函数
C语言修过为 (int)

三:其它差异
1.变量的定义:int nIndex( 1 );
C++初使化类会这么做,也可以把int 看作一个类
C语言当中修改为
int nIndex = 1;

2. for循环初使化: For (int i = 0; i < 10; i++)
不符合C99
C语言修过为
Int i = 0;
     For (i = 0; i < 10; i++)
3.赋值操作:++(p = a);    
error:左值需要增加操作数
C语言修过为
P = a;
++p;
4.引用部分,C++表示与变量用享一段内存。一个变量的别名。
C语言修改过
(1)传递的引用是只读,则可以去掉&,改为变量传递。
(2)传递的引用有写操作,改成传递指针。

猜你喜欢

转载自blog.csdn.net/zhangzheng_1986/article/details/78204441