Bonne journée

J'essaie d'utiliser une bibliothèque de pilotes / systèmes de fichiers C SD (Keil MDK), dans un projet C ++ 11. Il a été ajouté par le gestionnaire de pack dans Keil MDK 5.23. Je compile avec ARMCC 5.06u4

J'obtiens l'avertissement class "_ARM_MCI_STATUS" n'a pas de constructeur de copie approprié "ce qui est étrange, car l'en-tête dans lequel il est déclaré a extern "C" {.

Par défaut, le pack n'a pas d'option pour le définir sur C ou C ++, mais j'ai ajouté manuellement le fichier en tant que fichier C. Encore un problème.

La structure est déclarée, dans extern "C" { comme:

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;

Le problème se produit lorsque la structure est renvoyée à:

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

status est déclaré comme ARM_MCI_STATUS status;. Je ne vois pas pourquoi cela devrait être un problème.

Si je compile sans --cpp, il se compile sans problème.

Aucune suggestion?

2
Flip 25 juil. 2017 à 13:06

2 réponses

Pour résoudre ce problème dans Keil µVision 5.23, j'ai supprimé les indicateurs globaux «--cpp». Je me suis ensuite assuré que tous les fichiers C ++ se trouvent dans leurs propres groupes sources dans le projet. Dans les options de ce groupe, sous l'onglet "C / C ++", dans le champ "Misc Controls" ajouté l'indicateur "--cpp".

Les options sont obtenues par un clic droit sur le dossier dans la vue projet.

Options tab for Cpp sources group

Pour le moment, il se compile sans erreur. Le problème semble être que µVision 5.23 compilera tous les fichiers, c ou cpp, en C ++ si l'indicateur --cpp est défini globalement. Contrairement à Eclipse, il ne semble pas y avoir de moyen de définir des indicateurs différents pour les fichiers cpp et c.

Merci à UKMonkey et Rick Astley. J'ai appris quelque chose sur volatile et C ++.

0
Flip 25 juil. 2017 à 12:30

En C ++, le constructeur de copie par défaut est pour une référence const. Cependant, vous passez une référence volatile const; et aucun constructeur de copie n'est fait par défaut pour cela.

Vous trouverez peut-être préférable de marquer chaque membre de votre structure comme volatile plutôt que la structure entière.

3
UKMonkey 25 juil. 2017 à 10:16