2017-07-25 7 views
2

Guten TagCopy-Konstruktor für C flüchtiges bitfield struct

Ich versuche, ein C SD-Treiber/Dateisystem libary (Keil MDK) zu verwenden, in einem Projekt C++ 11. Es wurde vom Pack-Manager in Keil MDK 5.23 hinzugefügt. Ich bin Kompilieren mit ARMCC 5.06u4

ich die Warnung class "_ARM_MCI_STATUS" keinen passenden Copykonstruktor“hat, die ungerade ist, da der Header es in extern "C" { hat erklärt wird.

hat standardmäßig das Paket keine Option zu setzen es zu C oder C++, aber ich habe hinzugefügt manuell die Datei als C-Datei immer noch ein Problem

die Struktur deklariert wird, innerhalb extern "C" { als:..

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; 

das Problem tritt auf, wenn die Struktur zu sein, ist r eturned an:

static ARM_MCI_STATUS GetStatus (MCI_RESOURCES *mci) { 
    return mci->info->status; 
} 

Wo status als ARM_MCI_STATUS status; erklärt. Ich sehe nicht, warum es ein Problem sein sollte.

Wenn ich ohne die - CPP kompilieren, kompiliert es ohne Problem.

Irgendwelche Vorschläge?

+3

Nur weil es als "extern" gekennzeichnet ist C "" bedeutet nicht, dass es die C++ - Regeln umgeht. –

+2

Strukturen und Typnamen brauchen nie 'extern 'C'', nur Funktionen tun. Was es tut, verhindert im Grunde [name-mangling] (https://en.wikipedia.org/wiki/Name_mangling) von Funktionen. –

+0

@RickAstley Ich sammle das, obwohl mir eine bestimmte C++ - Regel, die einen Kopierkonstruktor für ein einfaches C-Bit-Feld erfordert, nicht bekannt ist. Weißt du was? – Flip

Antwort

3

Nur weil Ihre struct ist markiert extern "C" bedeutet nicht, es wird nicht noch als C++ - Code kompiliert werden.

Dies bedeutet, dass return mci->info->status; den implizit generierten Kopierkonstruktor aufruft. Da _ARM_MCI_STATUS mit volatile gekennzeichnet ist, sind es Mitglieder, was bedeutet, dass der Standardkopiekonstruktor T& nicht an die flüchtige Lvalue-Referenz binden kann, die übergeben wird.

Dies wird in der cppreference explanation erklärt:

Andernfalls wird die implizit deklarierte Copykonstruktor ist T :: T (T &). (Hinweis , die diese Regeln aufgrund des implizit deklarierte Copykonstruktor nicht zu einem flüchtigen lvalue Argumente binden kann.)

Und auch in dem aktuellen Standard (Just eine harte Zeit, die richtige Klausel zu finden, aber es ist da drin).

3

In C++ ist der Standardkopiekonstruktor für eine Konstante const. Sie gehen jedoch in eine const volatile Referenz über; und dafür wird standardmäßig kein Kopierkonstruktor erstellt.

Sie können es besser finden, jedes Mitglied Ihrer Struktur als flüchtig zu markieren, anstatt die gesamte Struktur.

0

Um dieses Problem in Keil μVision 5.23 zu beheben, habe ich die globalen Flags "--cpp" entfernt. Ich habe dann sichergestellt, dass alle C++ - Dateien in ihren eigenen Quellgruppen im Projekt sind. In den Optionen für diese Gruppe wurde auf der Registerkarte "C/C++" im Feld "Misc Controls" das Flag "--cpp" hinzugefügt.

Die Optionen erhalten Sie, indem Sie mit der rechten Maustaste auf den Ordner in der Projektansicht klicken.

Options tab for Cpp sources group

Im Moment ist es ohne Fehler kompiliert wird. Das Problem scheint zu sein, dass μVision 5.23 alle Dateien, c oder cpp, als C++ kompiliert, wenn das Flag --cpp global gesetzt ist. Im Gegensatz zu Eclipse scheint es keine Möglichkeit zu geben, unterschiedliche Flags für cpp- und c-Dateien zu setzen.

Dank UKMonkey und Rick Astley. Etwas über flüchtige und C++ gelernt.