В C (с gcc) у меня были некоторые структуры данных, представляющие собой массив с некоторой дополнительной информацией:
struct song {
uint tempo;
uint key;
note play[0]; // or play[] depending on compiler flavour
};
Iirc, это называется «гибкий массив» (http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html#Zero-Length)
Затем я мог бы выделить песню из N нот с malloc(sizeof(song)+N*sizeof(note))
во время выполнения.
В какой степени это поддерживается в g ++, если я не собираюсь использовать векторы на этот раз, или вводить бесполезные note*
указатель в song
?
Даже в C это не определено и не переносимо. GCC сознательно позволяет вам сойти с рук, но другие реализации не могут. Это потому, что вы обращаетесь к массиву за его пределами.
Этот «трюк» в C ++ точно такой же, как и в C. То есть, не стесняйтесь использовать его в GCC, где документация GCC говорит, что он поддерживается, но он никогда не будет «четко определенным, действительным C ++».
нет другого способа, кроме как использовать фиксированную длину или заметку *
потому что компилятор должен знать, как долго ваши песенные структуры, и каждая структура имеет одинаковую длину.
поэтому вы должны использовать примечание * или вектор