[英]Copy constructor for C volatile bitfield struct
美好的一天
我正在嘗試在C ++ 11項目中使用C SD驅動程序/文件系統庫(Keil MDK)。 它是由Keil MDK 5.23中的包管理器添加的。 我正在使用ARMCC 5.06u4進行編譯
我得到了警告class "_ARM_MCI_STATUS"
沒有合適的副本構造函數”,這很奇怪,因為在其聲明的標頭中具有extern "C" {
。
默認情況下,該包沒有選擇將其設置為C或C ++的選項,但是我已手動將文件添加為C文件。 還是個問題。
在extern "C" {
中將結構聲明為:
typedef volatile struct _ARM_MCI_STATUS {
uint32_t command_active : 1; ///< Command active flag
uint32_t command_timeout : 1; ///< Command timeout flag (cleared on start of next command)
uint32_t command_error : 1; ///< Command error flag (cleared on start of next command)
uint32_t transfer_active : 1; ///< Transfer active flag
uint32_t transfer_timeout : 1; ///< Transfer timeout flag (cleared on start of next command)
uint32_t transfer_error : 1; ///< Transfer error flag (cleared on start of next command)
uint32_t sdio_interrupt : 1; ///< SD I/O Interrupt flag (cleared on start of monitoring)
uint32_t ccs : 1; ///< CCS flag (cleared on start of next command)
uint32_t reserved : 24;
} ARM_MCI_STATUS;
在以下位置返回該結構時,會發生此問題:
static ARM_MCI_STATUS GetStatus (MCI_RESOURCES *mci) {
return mci->info->status;
}
status
聲明為ARM_MCI_STATUS status;
。 我不明白為什么這應該是一個問題。
如果我在沒有--cpp的情況下進行編譯,那么它將毫無問題地進行編譯。
有什么建議么?
在C ++中,默認的復制構造函數用於const引用。 但是,您正在傳遞const volatile引用。 並且默認情況下沒有復制構造函數。
您可能會發現最好將結構的每個成員標記為volatile而不是將整個結構標記為volatile。
僅僅因為您的struct
被標記為extern "C"
並不意味着它仍不會被編譯為C ++代碼。
這意味着return mci->info->status;
調用隱式生成的副本構造函數。 因為_ARM_MCI_STATUS
被標記為volatile
,所以它的成員是,這意味着采用T&
的默認副本構造函數無法綁定到傳遞的volatile左值引用。
在cppreference說明中對此進行了說明 :
否則,隱式聲明的副本構造函數為T :: T(T&)。 ( 請注意,由於這些規則,隱式聲明的副本構造函數無法綁定到volatile左值參數。 )
而且在實際標准中(很難找到正確的子句,但是它在那里)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.