将CPP文件移植成C文件方法和注意的问题
来源:互联网 发布:gmp软件 编辑:程序博客网 时间:2024/05/16 06:25
一:将类转换为结构体
第一步:将类当中的所有变量转换为结构体变量(结构体变量公有访问)// 映射点
class CMappingPoint
{
public:
__int64 m_nCoordinate; // 机床坐标(nm)
__int64 m_nMeasurement; // 激光干涉仪测量值(nm)
};
转换后
typedef struct MappingPoint
{
__int64 m_nCoordinate; // 机床坐标(nm)
__int64 m_nMeasurement; // 激光干涉仪测量值(nm)
}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)传递的引用有写操作,改成传递指针。
四:各文件移植顺序:
1. 与平台相关的部分:
此部分自己改写,因为平台不同实现有差异,所以需要注意它在内核实现哪些功能和驱动组织的结构,没有必要一句一句去翻译,这是不可能的。主可就是抓住它是用什么样的结构去实现它的功能。
2. 与平台不相关的部分:
总体原则:修改C++与C的差异。
PDO目录:顺序是PdoPosition.c PdoPulse.c PdoVm.c PdoFrame.c
五:目前还没有实现的问题
(1)ScrewCompensation.c 有关内核浮点除法运算
#define UInt32x32To64(a, b) ((unsigned long long)(((unsigned long long)((unsigned int)(a))) * ((unsigned int)(b))))
(2) PdoPulse.c PdoPulse_MotionToPulse函数,AxLength类
(3) PdoVm.c PdoVm_RunCode函数,引用A = (UINT32 &)Pdo[Ck],以及除法操作编译不通过。__aeabi_ldivmod
阅读全文
0 0
- 将CPP文件移植成C文件方法和注意的问题
- .c文件和.cpp文件导致的编译问题
- cpp文件引用c的头文件,千万注意
- .C文件和.CPP文件的区别
- C#如何将byte[]写入文件的方法和注意的问题
- MATLAB将c/cpp文件编译成mex32/mex64文件的方法
- .c 文件和 .cpp 文件
- 驱动中.c引用.cpp文件的注意
- .c 文件和.cpp 文件在工程中共存问题
- .c 文件和.cpp 文件在工程中共存问题
- .c和.cpp文件的区别
- 头文件和.cpp 或.c 文件之间的关系
- C生成文件和.CPP和.C的差别
- 【Cocos2dx】移植安卓避免手动添加cpp文件到Android.mk文件的方法
- 使用EMCV将工程.c文件改为.cpp文件所出现错误的解决办法
- .C和.CPP后缀文件的编译区别
- ubuntu下利用MATLAB将c/cpp文件转化成mexa64文件
- 关于cocos2d移植到Android上Android.mk需要手动增加cpp文件的问题
- 我的Laravel学习之路之表单验证 validation
- 【目标检测】RCNN算法详解
- 第一次写博客,随便聊聊写几句吧
- C#函数
- 蓝牙L2CAP剖析(二)
- 将CPP文件移植成C文件方法和注意的问题
- substring内存泄露原因及解决
- 练习go基础语法
- HMM之维特比算法
- torch.nn.Parameter(nn/parameter.py)
- CSS :after伪类实现圆形蒙板动画,翻转
- 用com.google.zxing创建二维码
- BZOJ1708 [Usaco2007 Oct]Money奶牛的硬币
- 比较总结线性表的几种主要存储结果