De l'Union de l'initialisation en C++ et C
J'ai construit une de travail de la bibliothèque C, qui utilise des constantes, dans les fichiers d'en-tête défini comme
typedef struct Y {
union {
struct bit_field bits;
uint8_t raw[4];
} X;
} CardInfo;
static const CardInfo Y_CONSTANT = { .raw = {0, 0, 0, 0 } };
Je sais que le .raw
initialiseur C est seulement la syntaxe.
Comment puis-je définir des constantes avec les syndicats d'une manière telle que je peux les utiliser en C et C++.
- êtes-vous sûr de la mode mixte tag?
- N'est-ce pas C++ de l'initialisation de la
union
s par le premier élément? I. e.static const Y_CONSTANT = {{0,0,0,0}};
- puis il donne d'autres mises en garde sur le manque de croisillons.
- J'ai juste essayé de faire de mon code, et il construit bien avec pas d'erreurs/avertissements. Êtes-vous sûr que vous êtes en utilisant le double de l'appareil? typedef struct A { union { struct bit_field bits; u_int8_t raw[4]; } X; } CardInfo; static const CardInfo Y_CONSTANT = {{0, 0, 0, 0 } };
- ok accolades semblent faire l'affaire si vous utilisez la bonne quantité d'entre eux et le bon ordre, mais cela me limite alors à seulement capable d'initialiser UN choix de l'union. ne jamais me permettant d'initialiser le second.
- C'est exact et c'est en quoi le langage est - vous êtes autorisé à initialiser le PREMIER élément de l'union et seule la première
- Ma solution actuelle: Éviter constante des structures mixtes fichiers d'en-tête! Définir des constantes dans les en-têtes extern et, de là, vers l'éditeur de liens symbole. initialiser les constantes dans C. soit une langue ne l'initialisation me semble moins compliqué.
- Les langues sont différentes. En C++ les
bit_field
aurait un constructeur pour initialiser ses membres, et vous ne serait guère besoin de l'union. Lorsque vous allez pour les plus petit dénominateur commun, vous limiter vous-même. - eh bien, nous avons une bibliothèque écrite en C parce que il a besoin pour s'exécuter sur un microcontrôleur un C++ n'est pas une option ENCORE là. le code C++ est le simulateur et le framework de test. l'alternative serait de tout écrire en C et je crois que ce serait pire. ou vous avez de meilleures suggestions?
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème. Pour C89 suivantes est remplie:
J'ai trouvé cette explication:
L'initialisation des structures et des syndicats
Je crois que C++11 vous permet d'écrire votre propre constructeur comme suit:
Ce défaut-initialise une union de type
Foo
avec membre actifraw
, qui a tous les éléments initialisé à zéro. (Avant C++11, il n'y avait aucun moyen d'initialiser les tableaux qui ne sont pas des objets.)#ifdef __cplusplus
sur le droit des endroits que fichier d'en-tête includeable. Ah que pourrait obtenir encore plus floue.J'ai décidé de choisir le chemin d'accès suivant.
.member
d'initialisation.static const struct Foobar
initialisation des membresAu lieu de déclarer la variable globale:
et l'initialiser dans une section globale:
et au lieu de énerve le compilateur C++ moderne, ANSI C99 syntaxe, je laisse le linker faire le travail demangling C symboles.
C89 autorisés pour l'initialisation des syndicats directement par l'inscription de l'élément que vous souhaitez init (comme ce que vous avez dans votre code). C99 a changé, de sorte que vous pouvez init d'une union, c'est le premier élément.
C++ permet uniquement de cette forme de l'initialisation par le premier élément. Donc, c'est le code qui devrait fonctionner pour les deux cas:
struct bit_field
.