2013-05-16 147 views
1

我發現在C中運行的代碼(儘管帶有警告)現在給C++一個錯誤。我想知道爲什麼會產生錯誤,以及如何解決。C vs C++:如何修復? Typedef枚舉

我將別人的代碼,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’ 

回答

1

試試這個:

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

這就是答案。謝謝......我應該知道。一旦Stackoverflow允許我將它標記出來。 – Demortes

0

嘗試移動施法:

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

您也可以使用鑄造的更加C++版本:

slaveSelectAddr = static_cast<SPI_SSADDR>(slaveSelectAddr & 0x07); 
0
slaveSelectAddr = static_cast<SPI_SSADDR>(static_cast<int>(slaveSelectAddr) & 0x07); 
4

在C++中,不像在C,您不能隱式轉換的整數類型爲枚舉類型。表達式的結果是一個整數類型,因爲枚舉被轉換爲整數時,你對它們執行算術,因此必須顯式轉換回:

slaveSelectAddr = static_cast<SPI_SSADDR>(slaveSelectAddr & 0x07); 
+1

通常的解決方案,如果他需要這麼多,將會定義重載的操作符來完成它。 –

+0

我在這裏看到upvotes並想知道爲什麼這似乎是更好的答案?接受和投票的人做同樣的事情,不是嗎?至於過載評論,我不認爲我需要它很多...但我沒有移植整個代碼,所以如果它涉及到它,我會超載它,只是想保持簡單。 – Demortes

+1

@Demortes:投票是許多獨立思維的突發行爲;他們平均只有意義。也許有些人喜歡更長的解釋,或C++的演員,或缺乏多餘的閹割;但接受的答案是完全正確的。 –