如何将此代码从C转换为C ++?

时间:2019-05-12 18:01:44

标签: c++ algorithm programming-languages c embedded

我正在使用mbed开发嵌入式项目。芯片的制造商使用此查找生成器指定了循环冗余测试,但是它是用C编写的。 查找生成器代码

    ///////////////////////configures CRC check lookup table////////////////////////
short pec15Table[256];
short CRC15_POLY = 0x4599;   //CRC code

void configCRC(void) 
{
    for (int i = 0; i < 256; i++)
    {
        remainder = i << 7;
        for (int bit = 8; bit > 0; --bit)
        {
            if (remainder & 0x4000)
            {
                remainder = ((remainder << 1));
                remainder = (remainder ^ CRC15_POLY)
            }
            else
            {
                remainder = ((remainder << 1));
            }
        }
    }
    pec15Table[i] = remainder&0xFFFF;
};

我对C ++还不是很满意,所以我只复制并粘贴了它,并检查了清晰的语法错误。例如,我将int16声明切换为short和unsigned short。但是,当我编译它时,出现以下错误。 这对我来说没有意义。我确定我做错了事。

Error: Cannot determine which instance of overloaded function "remainder"  is intended in "config.cpp", Line: 20, Col: 10

2 个答案:

答案 0 :(得分:1)

很明显,您与std::remainder存在命名空间冲突。这是避免全局变量的众多原因之一。否则,C和C ++应该相同。

尽管如此,该代码非常幼稚。不仅必须重写该函数以正确获取参数,而且类型用法无处不在。

永远不要对带符号的类型进行按位算术,因为这会导致许多定义不当的行为错误。 shortint之类的所有“草率键入”类型都必须替换为stdint.h中的类型。您只能使用无符号类型。您需要了解隐式整数提升。

答案 1 :(得分:0)

只需将变量的余数重命名为fremainder(或您想要的其他名称),即可看到编译过程中的魔力。

这类问题之所以出现,是因为在命名变量时没有遵循任何标准约定。

选中此link,了解为什么需要重命名变量