我是C的新手,为了我的学徒,我必须尝试将Arduino代码转换为C代码,但我遇到了麻烦。 在其中一个标题中,我有这个模板:
template <class LinkType> class TPixy
{
public:
TPixy(uint16_t arg=PIXY_DEFAULT_ARGVAL);
~TPixy();
uint16_t getBlocks(uint16_t maxBlocks=1000);
int8_t setServos(uint16_t s0, uint16_t s1);
int8_t setBrightness(uint8_t brightness);
int8_t setLED(uint8_t r, uint8_t g, uint8_t b);
void init();
Block *blocks;
private:
boolean getStart();
void resize();
LinkType link;
boolean skipStart;
BlockType blockType;
uint16_t blockCount;
uint16_t blockArraySize;
};
但是C语言没有模板,因此我必须将其转换为“兼容”的东西,因为另一个标头中有typedef
来调用此模板:
typedef TPixy<LinkUART> PixyUART;
我以为我可以使用#define
将模板转换为宏,但我不知道它是否正确,如果是,我不知道该怎么做。
我该如何解决这个问题?你能救我吗?
答案 0 :(得分:1)
此模板看起来非常简单,因此您应该只需删除template<LinkType>
关键字,只需将所有LinkType
替换为LinkUART
。
但请注意,这是class
。你还有很多工作要做,把它全部转换成普通的C,因为那里没有类的支持。
简而言之,删除template关键字,将TPixy
类重命名为PixyUART
,删除所有成员函数(注意ctor和dtor!),使它们成为独立函数,指向这个班,即:
int8_t setBrightness();
到
int8_t PixyUART_setBrightness(PixyUART* obj);
在其实施中,将所有this->
更改为obj->
。
您应该最终得到一个现在只有字段的类。将class
关键字更改为struct
并根据需要添加typedef和任何C闪烁,基本上应该是它。
可能需要做更多的工作,但这是必须的起点。
再次注意ctors和dtors。您需要手动使用它们,因为malloc/free
不会自动调用它们。