2017-06-05 3 views
0

J'essaye d'écrire un programme C++ pour un microcontrôleur Atmel.Membre d'accès C++ d'une structure dans une union

Je dois utiliser certaines des fonctions qui ont déjà été écrites dans la bibliothèque ASF, et je le fais en copiant une partie du code dans les fonctions C++.

-je obtenir cette erreur sur la compilation:

'union Pm' est pas membre nommé 'PM_CPUMASK'

L'union de type Pm ressemble à quelque chose comme ceci:

typedef union { 
struct { 
    .... 
} bf; 
struct { 
    .... 
    RwReg PM_CPUMASK; 
    .... 
} reg; 
} Pm;` 

Dans le code ASF, le membre PM_CPUMASK est accédé comme ceci:

unsigned int mask = *(&PM->PM_CPUMASK + busId); 

Mais j'obtiens une erreur. Je pense que cela est valide en C, mais en C++, j'aurais besoin d'accéder à la structure nommée, puis au membre réel. En utilisant *(&PM->reg.PM_CPUMASK...) Je ne reçois aucune erreur, mais existe-t-il un moyen d'activer ce style d'accès membre dans le compilateur C++?

BTW, il n'y a pas de conflits de nommage dans les membres des 2 structs. Merci.

+0

Pour moi, ça ne ressemble pas non plus à un C valide. Vous pouvez essayer de supprimer les noms de structure internes ('bf' et' reg'). Cela ferait fonctionner le code si votre compilateur supporte les structures anonymes comme une extension (non-standard). (Sinon, la seule autre option est '#define PM_CPUMASK reg.PM_CPUMASK', mais c'est un hack moche.) – HolyBlackCat

Répondre

3

Je suppose que vous avez copié-collé le code, puis modifié. Le code d'origine était quelque chose comme ça

typedef union { 
struct { 
    .... 
}; 
struct { 
    .... 
    RwReg PM_CPUMASK; 
    .... 
}; 
} Pm; 

Quelle est struct anonyme, qui est une extension du compilateur, et il n'y a pas d'extension par défaut comme celui-ci pour compilateur C++, voir here.

Ensuite, vous avez ajouté des noms à ces structures. C'est pourquoi vous devez utiliser un autre identifiant pour accéder au membre. Désolé, je ne me suis pas trompé. Mais le fait est que vous devez utiliser un nom supplémentaire ici.

+0

Vous avez quelque peu raison. J'ai copié le code d'une fonction C, mais l'union est définie dans un fichier déjà inclus, que je ne modifierai pas. Mais quand j'ai vérifié le même fichier dans un projet C, Pm n'était plus défini comme une union de structures, mais simplement comme une structure. Il semble donc que je doive modifier un peu le code pour travailler avec les fichiers C++, même s'ils sont très similaires. – user3808318

+0

@ user3808318 rappelez-vous toujours que C et C++ sont deux langages séparés, même s'ils peuvent sembler similaires, ils ont parfois une sémantique différente pour une source identique. –

+0

@JesperJuhl Je ne connais actuellement aucun cas, où pour la même source compilée avec C et C++ il y aura des sémantiques différentes, ce qui serait intéressant à voir, pourrait pointer vers quelques exemples? Parce que je sais que C est juste un sous-ensemble de C++. Cela dit, lorsque vous transférez du code C vers C++, il se peut que certaines fonctions syntaxiques ne soient pas favorables aux nouvelles, mais un cas où compiler du code C avec un compilateur C++ aura un comportement différent (sémantique) serait agréable à voir. – Yuki