Tengo que definir un tipo de datos de 24 bits. Estoy usando char[3]
para representar el tipo. ¿Puedo escribir def char[3]
a type24
? Lo probé en una muestra de código. Puse typedef char[3] type24;
en 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 en type24_to_int32(type24 val)
lugar de type24_to_int32(char value[3])
.
210
type24 foo
, cuáles serían los tamaños, tipos y significados defoo
,*foo
,**foo
,&foo
, y&&foo
? ¿Han cambiado los significados y la legalidad de tales expresiones a lo largo de los años?Usted quiere
Las declaraciones de tipo C son extrañas de esa manera. Pones el tipo exactamente donde iría el nombre de la variable si declararas una variable de ese tipo.
fuente
De la respuesta de R .. :
Los usuarios que no ven que es una matriz probablemente escribirán algo como esto (que falla):
Se compilará con las siguientes advertencias:
Y produce el siguiente resultado:
fuente
Las matrices no se pueden pasar como parámetros de función por valor en C.
Puede poner la matriz en una estructura:
y luego pasar eso por valor, pero por supuesto, es menos conveniente usarlo: en
x.byte[0]
lugar dex[0]
.Su función en
type24_to_int32(char value[3])
realidad pasa por puntero, no por valor. Es exactamente equivalente atype24_to_int32(char *value)
, y3
se ignora.Si estás pasando por feliz puntero, podría seguir con la matriz y hacer:
Esto pasará un puntero a matriz, no un puntero a primer elemento, por lo que lo usará como:
No estoy seguro de que sea realmente una ganancia, ya que si escribes accidentalmente,
value[1]
sucede algo estúpido.fuente
decay
alguna parte (y tal vez señalando que la situación es peor para devolver matrices, lo que no funciona en absoluto).Para usar el tipo de matriz correctamente como un argumento de función o parámetro de plantilla, haga una estructura en lugar de un typedef, luego agregue una
operator[]
a la estructura para que pueda mantener la funcionalidad de la matriz de la siguiente manera:fuente
char&
tampoco looperator[]
son las cosas que existen en C.Aquí hay un breve ejemplo de por qué typedef array puede ser confusamente inconsistente. Las otras respuestas proporcionan una solución alternativa.
Esto produce la salida
porque type24 como parámetro es un puntero. (En C, las matrices siempre se pasan como punteros). Afortunadamente, el compilador gcc8 emitirá una advertencia por defecto.
fuente