typedef longueur fixe tableau
Je dois définir un 24-bits type de données.Je suis à l'aide de char[3]
pour représenter le type. Puis-je typedef char[3]
à type24
? Je l'ai essayé dans un exemple de code. J'ai mis typedef char[3] type24;
dans mon fichier d'en-tête. Le compilateur n'a pas à s'en plaindre. Mais quand j'ai défini une fonction void foo(type24 val) {}
dans mon fichier C, il n'a à se plaindre. Je voudrais être en mesure de définir des fonctions comme type24_to_int32(type24 val)
au lieu de type24_to_int32(char value[3])
.
Vous devez vous connecter pour publier un commentaire.
Le typedef serait
Cependant, c'est probablement une très mauvaise idée, parce que le type obtenu est de type tableau, mais les utilisateurs de ne pas voir que c'est un type tableau. Si elle est utilisée comme un argument de fonction, il sera passé par référence et non par valeur, et la
sizeof
pour il sera alors mal.Une meilleure solution serait
Probablement, vous voulez aussi être en utilisant
unsigned char
au lieu dechar
, puisque ce dernier a la mise en œuvre définie par ce paramètre.type24 foo
, quelles seraient les tailles, les types, et les significations defoo
,*foo
,**foo
,&foo
, et&&foo
? Ont le sens et la légalité de ces expressions changé au fil des ans?type24
les doublons avant et après{ char x[3]; }
?sizeof(type24)
est peu probable d'être 3. Vous aurez probablement besoin d'un peu de compilateur dépendante de bugs. Heureusement, vous pouvez vous assurer que les correctifs sont utilisés avec une judicieusestatic_assert
.$ cat 1.cpp
:struct three { char three[3]; }; static_assert(sizeof(3) == 3, "urk");
et$ g++ -std=c++11 1.cpp
donne1.cpp:2:1: error: static assertion failed: urk static_assert(sizeof(3) == 3, "urk");
3
est unint
, etsizeof(int)!=3
.struct
qui a seulementchar
membres n'ont aucun rembourrage. Je suis tellement habitué à le compilateur ajout de remplissage pour aligner plus de types que j'ai raté ce cas particulier. Eh bien, vivre et maigre, je suppose. (Oh, j' doit lire mon propre code—je ne voudrais pas m'employer :-).)Vous voulez
C type de déclarations est étrange cette façon. Vous mettez le type exactement où le nom de la variable irait si vous avez été la déclaration d'une variable de ce type.
De R..'s réponse:
Les utilisateurs qui ne voient pas que c'est un tableau sera très probablement écrire quelque chose comme ceci (qui échoue):
De compiler avec les avertissements suivants:
Et produit la sortie suivante:
Les tableaux peuvent pas être transmis en fonction de paramètres par valeur en C.
Vous pouvez mettre le tableau dans une structure (struct):
et puis passer que par la valeur, mais bien sûr, alors il est moins pratique à utiliser:
x.byte[0]
au lieu dex[0]
.Votre fonction
type24_to_int32(char value[3])
passe par pointeur, et non par valeur. C'est exactement équivalente àtype24_to_int32(char *value)
, et la3
est ignoré.Si vous êtes heureux de passage par pointeur, vous pourrait coller avec le tableau et faire:
Cela va passer un pointeur de tableau, pas de pointeur vers du premier élément, de sorte que vous l'utiliser comme:
Je ne suis pas sûr que ce soit vraiment un gain, car si vous avez accidentellement écrire
value[1]
alors quelque chose de stupide qui se passe.decay
quelque part (et peut-être, en soulignant que la situation est pire pour retour tableaux - ce qui ne fonctionne pas à tous).D'utiliser le type de tableau correctement comme un argument de fonction ou paramètre du modèle, faire une structure au lieu d'une définition de type, puis ajouter une
operator[]
à la structure de sorte que vous pouvez garder le tableau comme fonctionnalités comme:char&
nioperator[]
sont des choses qui existent dans C.