Equivalência de hack de estruturas em C ++
A estrutura hack onde você tem uma matriz de comprimento 0 como o último membro de uma estrutura de C90 e C99 é bem conhecida, e com a introdução de membros flexíveis da matriz em C99, nós até temos uma maneira padronizada de usá-la com[]
. Infelizmente, o C ++ não fornece tal construção, e (pelo menos com o Clang3.4), compilando uma struct com[0]
ou[]
irá produzir um aviso de compilação com--std=c++11 -pedantic
:
$ cat test.cpp
struct hack {
char filler;
int things[0];
};
$ clang++ --std=c++11 -pedantic test.cpp
\test.cpp:3:14: warning: zero size arrays are an extension [-Wzero-length-array]
int things[0];
e da mesma forma
$ cat test.cpp
struct fam {
char filler;
int things[];
};
$ clang++ --std=c++11 -pedantic test.cpp
\test.cpp:3:7: warning: flexible array members are a C99 feature [-Wc99-extensions]
int things[];
Minha pergunta então é essa; Digamos que eu quero ter uma estrutura que contém uma matriz de tamanho variável como o último item em C ++. Qual é a coisa certa a fazer, dado um compilador que suporte ambos? Devo ir com o hack struct[0]
(que é uma extensão do compilador), ou o FAM[]
(que é um recurso C99)? Tanto quanto eu entendo, ou vai funcionar, mas eu estou tentando descobrir qual é o mal menor?
Além disso, antes de as pessoas começarem a sugerir queint*
para uma peça de memória alocada separadamente na struct, essa não é uma resposta satisfatória. Eu quero alocar uma única peça de memória para manter minha estrutura e os elementos da matriz. Usando um std :: vector também cai na mesma categoria. Se você quer saber por que eu não quero usar um ponteiro em vez disso, oR.'s answer para outra pergunta dá uma boa visão geral.
Houve algumas perguntas semelhantes em outros lugares, mas nenhuma delas oferece uma resposta a essa pergunta em particular:
Os membros da matriz flexível são válidos em C ++?: Muito semelhante, mas a questão é se o FAM é válido em C ++ (não). Estou procurando um bom motivo para escolher um ou outro.Variante em conformidade com o antigo "struct hack": Propõe uma alternativa, mas não é nem bonita, nem sempre correta (e se o preenchimento for adicionado à estrutura?). Acessar os elementos mais tarde também não é tão limpo quanto fazere.things[42]
.