2

再会

我正在尝试在 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 的情况下编译,那么它编译没有问题。

有什么建议么?

4

3 回答 3

3

在 C++ 中,默认的复制构造函数用于 const 引用。但是,您正在传递一个 const volatile 引用;并且默认情况下没有复制构造函数。

您可能会发现将结构的每个成员标记为易失性而不是整个结构更好。

于 2017-07-25T10:16:24.867 回答
3

仅仅因为你struct被标记extern "C"并不意味着它仍然不会被编译为 C++ 代码。

这意味着return mci->info->status;调用隐式生成的复制构造函数。因为_ARM_MCI_STATUS是被标记volatile的,所以它的成员是,这意味着默认的复制构造函数T&不能绑定到它传递的易失性左值引用。

这在cppreference 解释中进行了解释

否则,隐式声明的复制构造函数是 T::T(T&)。(请注意,由于这些规则,隐式声明的复制构造函数不能绑定到 volatile 左值参数。

而且在实际标准中(只是很难找到正确的条款,但它就在那里)。

于 2017-07-25T10:18:51.253 回答
0

为了解决 Keil µVision 5.23 中的这个问题,我删除了全局“--cpp”标志。然后我确保所有 C++ 文件都在项目中它们自己的源组中。在该组的选项中,在“C/C++”选项卡下,在“Misc Controls”字段中添加了“--cpp”标志。

通过右键单击项目视图中的文件夹获得选项。

Cpp 源组的选项选项卡

目前它编译没有错误。问题似乎是,如果全局设置了 --cpp 标志,µVision 5.23 会将所有文件(c 或 cpp)编译为 C++。与 Eclipse 不同,似乎没有办法为 cpp 和 c 文件设置不同的标志。

感谢 UKMonkey 和 Rick Astley。学习了一些关于 volatile 和 C++ 的知识。

于 2017-07-25T12:30:10.760 回答