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

questionAnswers(4)

yourAnswerToTheQuestion