C encontre o tamanho estático da matriz (evitando erros) [duplicado]
Esta pergunta já tem uma resposta aqui:
Macro de tamanho de matriz que rejeita ponteiros 9 respostas Encontrar o tamanho de uma matriz estática é uma operação comum. Vejo:C encontre o tamanho estático da matriz - sizeof(a) / sizeof((a)[0])
Isso pode ser envolvido em uma macro, por exemplo:
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
e qualquer maneira que seja possível passar acidentalmente um ponteiro regula
por exemplo:void func(SomeArray **foo) { int i = ARRAY_SIZE(foo); }
nquanto seu C válido, mas muitas vezes acaba sendo um erro lógic
possível evitar esse err (aproveitando a vantagem do processador para falhar em um campo de bits de comprimento zero).
#define ARRAY_SIZE(a) \
((sizeof(struct { int isnt_array : \
((const void *)&(a) == &(a)[0]); }) * 0) + \
(sizeof(a) / sizeof(*(a))))
Descobri que essa macro funciona com o GCC, mas falha com o Clang, para membros de referência indireta. comerror: expression is not an integer constant expression
por exemplo
char word[8]; int i = ARRAY_SIZE(word);
Está bemstruct Bar { word[8]; }
void func(struct Bar *foo) { int i = ARRAY_SIZE(foo->word); }
falha.Existe uma maneira mais portátil de implementar isso? (trabalhar com Clang é bom, é claro, embora eu esteja interessado em portabilidade geral ... outros compiladores também
arece uma tarefa tão comum que seria bom ter uma macro portátil reutilizáve