Je dois définir un type de données 24 bits que j'utilise 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;
mon fichier d'en-tête. Le compilateur ne s'en est pas plaint. Mais quand j'ai défini une fonction void foo(type24 val) {}
dans mon fichier C, il s'est plaint. J'aimerais pouvoir définir des fonctions comme type24_to_int32(type24 val)
au lieu de type24_to_int32(char value[3])
.
210
type24 foo
, quelles seraient les tailles, les types et les significationsfoo
,*foo
,**foo
,&foo
et&&foo
? La signification et la légalité de telles expressions ont-elles changé au fil des ans?Tu veux
Les déclarations de type C sont étranges de cette façon. Vous placez le type exactement où irait le nom de la variable si vous déclariez une variable de ce type.
la source
De la réponse de R .. :
Les utilisateurs qui ne voient pas qu'il s'agit d'un tableau écriront très probablement quelque chose comme ça (qui échoue):
Il se compilera avec les avertissements suivants:
Et produit la sortie suivante:
la source
Les tableaux ne peuvent pas être passés en tant que paramètres de fonction par valeur en C.
Vous pouvez mettre le tableau dans une structure:
puis passez cela par valeur, mais bien sûr, c'est moins pratique à utiliser:
x.byte[0]
au lieu dex[0]
.Votre fonction
type24_to_int32(char value[3])
passe en fait par un pointeur et non par une valeur. Il est exactement équivalent àtype24_to_int32(char *value)
et3
est ignoré.Si vous êtes heureux de passer par un pointeur, vous pouvez vous en tenir au tableau et faire:
Cela passera un pointeur vers un tableau, pas un pointeur vers le premier élément, vous l'utilisez donc comme:
Je ne suis pas sûr que ce soit vraiment un gain, car si vous écrivez accidentellement,
value[1]
quelque chose de stupide se produit.la source
decay
quelque part (et peut-être en soulignant que la situation est pire pour les tableaux de retour - ce qui ne fonctionne pas du tout).Pour utiliser correctement le type de tableau en tant qu'argument de fonction ou paramètre de modèle, créez une structure au lieu d'un typedef, puis ajoutez un
operator[]
à la structure afin de pouvoir conserver la fonctionnalité de type tableau comme ceci:la source
char&
neoperator[]
sont des choses qui existent dans C.Voici un bref exemple des raisons pour lesquelles le tableau typedef peut être source de confusion. Les autres réponses fournissent une solution de contournement.
Cela produit la sortie
car type24 comme paramètre est un pointeur. (En C, les tableaux sont toujours transmis comme pointeurs.) Heureusement, le compilateur gcc8 émet un avertissement par défaut.
la source