1

我发现在 C 中有效的代码(尽管有警告)现在在移到 C++ 时给我一个错误。我想知道为什么这会产生错误,以及如何解决。

我正在将其他人的代码转换为 C++,这给了我错误(拉出并在自己的文件中测试)...

#include <stdio.h>

typedef enum SPI_SSADDR_TYPE
{
    SSADDR0 = 0,
    SSADDR1 = 1,
    SSADDR2,
    SSADDR3,
    SSADDR4,
    SSADDR5,
    SSADDR6,
    SSADDR7,
    SSADDR8
} SPI_SSADDR;

void SPI_set_slave_addr( SPI_SSADDR slaveSelectAddr );

int main()
{
    SPI_set_slave_addr(SSADDR8);
    return 0;
}    

void SPI_set_slave_addr( SPI_SSADDR slaveSelectAddr )
{
    slaveSelectAddr = slaveSelectAddr & (SPI_SSADDR)(0x07); // This line
    printf("Test: %d\r\n", slaveSelectAddr);
    return; 
}

它产生的错误是:

TypeDef.cpp: In function ‘void SPI_set_slave_addr(SPI_SSADDR)’:
TypeDef.cpp:26: error: invalid conversion from ‘int’ to ‘SPI_SSADDR’
4

4 回答 4

4

在 C++ 中,与 C 不同,您不能将整数类型隐式转换为枚举类型。表达式的结果是一个整数类型,因为当你对它们执行算术运算时,枚举被转换为整数,因此必须显式地转换回来:

slaveSelectAddr = static_cast<SPI_SSADDR>(slaveSelectAddr & 0x07);
于 2013-05-16T15:39:26.407 回答
1

尝试这个:

slaveSelectAddr = (SPI_SSADDR)((int)slaveSelectAddr & 0x07);
于 2013-05-16T15:36:29.103 回答
0

尝试移动演员:

slaveSelectAddr = (SPI_SSADDR)(slaveSelectAddr & 0x07);

您还可以使用更多 C++ 版本的演员表:

slaveSelectAddr = static_cast<SPI_SSADDR>(slaveSelectAddr & 0x07);
于 2013-05-16T15:35:56.440 回答
0
slaveSelectAddr = static_cast<SPI_SSADDR>(static_cast<int>(slaveSelectAddr) & 0x07);
于 2013-05-16T15:36:04.793 回答