【问题标题】:How can I convert this code from C to C++?如何将此代码从 C 转换为 C++?
【发布时间】:2019-09-29 20:25:54
【问题描述】:

我正在使用 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++,所以我只是复制并粘贴了它并检查了明确的语法错误。例如,我用 short 和 unsigned short 切换了 int16 声明。但是,当我编译它给我以下错误。 这对我来说没有意义。我确定我做错了什么。

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

【问题讨论】:

  • 奇怪的错误,但似乎缺少remainder 的声明。
  • 如果remainder与其他东西发生冲突,重命名它。
  • C++ 标准库中有一个std::remainder 函数。如果您的源代码中有using namespace std;,请将其删除,这是一个坏习惯。
  • 您没有声明变量余数,因此编译器假定“余数”是 C++ 标准库中的余数函数。使用“short”是不安全的,因为它只被定义为“至少 16 位”。使用 int16_t 或 uint16_t(顺便说一下,这也是标准的 C 类型)。
  • 芯片厂商是谁?此代码由业余爱好者编写;您不能在生产质量软件中使用它。

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


【解决方案1】:

显然您与std::remainder 发生了命名空间冲突。这是避免使用全局变量的众多原因之一。 C 和 C++ 在这里应该是相同的。

值得注意的是,这段代码写得非常幼稚。不仅必须重写函数以正确获取参数,而且类型使用无处不在。

您永远不应该对有符号类型进行按位算术,因为这会导致许多定义不明确的行为错误。所有像shortint 这样的“草率打字”类型都必须替换为stdint.h 中的类型。您应该只使用无符号类型。您需要注意隐式整数提升。

【讨论】:

    【解决方案2】:

    只需将变量剩余部分重命名为 frmainder(或您希望的其他名称)并查看编译中的魔力。

    由于在命名变量时未遵循任何标准约定,因此出现此类问题。

    查看link 了解为什么需要重命名变量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      相关资源
      最近更新 更多