matriz de longitud fija typedef
Tengo que definir un tipo de datos de 24 bits. Lo estoy usando char[3]
para representar el tipo. ¿Puedo escribir definición char[3]
en type24
? Lo probé en un ejemplo de código. Puse typedef char[3] type24;
mi archivo de encabezado. El compilador no se quejó de ello. Pero cuando definí una función void foo(type24 val) {}
en mi archivo C, se quejó. Me gustaría poder definir funciones como type24_to_int32(type24 val)
en lugar de type24_to_int32(char value[3])
.
El tipo de definición sería
typedef char type24[3];
Sin embargo, esto probablemente sea una muy mala idea, porque el tipo resultante es un tipo de matriz, pero los usuarios no verán que es un tipo de matriz. Si se usa como argumento de función, se pasará por referencia, no por valor, y el sizeof
for será incorrecto.
Una mejor solución sería
typedef struct type24 { char x[3]; } type24;
Probablemente también quieras usarlo unsigned char
en lugar de char
, ya que este último tiene una firma definida por la implementación.
Quieres
typedef char type24[3];
Las declaraciones de tipo C son extrañas en ese sentido. Pones el tipo exactamente donde iría el nombre de la variable si estuvieras declarando una variable de ese tipo.
De la respuesta de R.. :
Sin embargo, esto probablemente sea una muy mala idea, porque el tipo resultante es un tipo de matriz, pero los usuarios no verán que es un tipo de matriz. Si se usa como argumento de función, se pasará por referencia, no por valor, y el tamaño de éste será incorrecto.
Los usuarios que no ven que es una matriz probablemente escribirán algo como esto (que falla):
#include <stdio.h>
typedef int twoInts[2];
void print(twoInts *twoIntsPtr);
void intermediate (twoInts twoIntsAppearsByValue);
int main () {
twoInts a;
a[0] = 0;
a[1] = 1;
print(&a);
intermediate(a);
return 0;
}
void intermediate(twoInts b) {
print(&b);
}
void print(twoInts *c){
printf("%d\n%d\n", (*c)[0], (*c)[1]);
}
Se compilará con las siguientes advertencias:
In function ‘intermediate’:
warning: passing argument 1 of ‘print’ from incompatible pointer type [enabled by default]
print(&b);
^
note: expected ‘int (*)[2]’ but argument is of type ‘int **’
void print(twoInts *twoIntsPtr);
^
Y produce el siguiente resultado:
0
1
-453308976
32767