Eu tenho que definir um tipo de dados de 24 bits. Estou usando char[3]
para representar o tipo. Posso typedef char[3]
para type24
? Eu tentei em um exemplo de código. Eu coloquei typedef char[3] type24;
no meu arquivo de cabeçalho. O compilador não reclamou. Mas quando defini uma função void foo(type24 val) {}
no meu arquivo C, ela se queixou. Eu gostaria de poder definir funções como em type24_to_int32(type24 val)
vez de type24_to_int32(char value[3])
.
210
type24 foo
, quais seriam os tamanhos, tipos e significados defoo
,*foo
,**foo
,&foo
, e&&foo
? Os significados e a legalidade de tais expressões mudaram ao longo dos anos?Você quer
As declarações do tipo C são estranhas dessa maneira. Você coloca o tipo exatamente para onde o nome da variável iria se estivesse declarando uma variável desse tipo.
fonte
Da resposta de R .. :
Os usuários que não vêem que é uma matriz provavelmente escreverão algo assim (que falhará):
Ele será compilado com os seguintes avisos:
E produz a seguinte saída:
fonte
Matrizes não podem ser passadas como parâmetros de função por valor em C.
Você pode colocar a matriz em uma estrutura:
e depois passar isso por valor, mas é claro que é menos conveniente usar: em
x.byte[0]
vez dex[0]
.Sua função
type24_to_int32(char value[3])
realmente passa pelo ponteiro, não pelo valor. É exatamente equivalente atype24_to_int32(char *value)
, e o3
é ignorado.Se você está feliz passando pelo ponteiro, você pode ficar com a matriz e fazer:
Isso passará um ponteiro para o array, não um ponteiro para o primeiro elemento; portanto, você o usa como:
Não sei se isso é realmente um ganho, pois se você escrever acidentalmente
value[1]
, algo estúpido acontece.fonte
decay
algum lugar (e talvez apontando que a situação é pior para o retorno de matrizes - o que não funciona de todo).Para usar o tipo de matriz corretamente como argumento de função ou parâmetro de modelo, faça uma struct em vez de um typedef e adicione uma
operator[]
à estrutura para que você possa manter a matriz como uma funcionalidade da seguinte maneira:fonte
char&
nemoperator[]
são coisas que existem em C.Aqui está um pequeno exemplo de por que o array typedef pode ser confusamente inconsistente. As outras respostas fornecem uma solução alternativa.
Isso produz a saída
porque type24 como parâmetro é um ponteiro. (Em C, as matrizes sempre são passadas como ponteiros.) Felizmente, o compilador gcc8 emitirá um aviso por padrão.
fonte