簡體   English   中英

復制C易失性位域結構的構造函數

[英]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左值參數。

而且在實際標准中(很難找到正確的子句,但是它在那里)。

為了在Keil µVision 5.23中解決此問題,我刪除了全局“ --cpp”標志。 然后,我確保所有C ++文件都在項目中各自的源組中。 在該組的選項中,在“ C / C ++”選項卡下的“其他控件”字段中,添加了“ --cpp”標志。

通過右鍵單擊項目視圖中的文件夾可獲得選項。

Cpp來源組的“選項”選項卡

目前,它編譯沒有錯誤。 問題在於,如果全局設置--cpp標志,µVision 5.23會將c或cpp的所有文件編譯為C ++。 與Eclipse不同,似乎沒有辦法為cpp和c文件設置不同的標志。

感謝UKMonkey和Rick Astley。 了解了有關volatile和C ++的知識。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM