В C код
char *c = "Hello world!";
сохраняет Hello world!\0
в родате и инициализирует c
указателем на него.Как я могу сделать это с чем-то, кроме строки?
В частности, я пытаюсь определить свой собственный тип строки
typedef struct {
size_t Length;
char Data[];
} PascalString;
И затем хочу какой-то макрос, чтобы я мог сказать
const PascalString *c2 = PASCAL_STRING_CONSTANT("Hello world!");
И пусть он ведет себя так же, в нем \x0c\0\0\0Hello world!
хранится в родате и c2
инициализируется указателем на него.
Я пытался использовать
#define PASCAL_STRING_CONSTANT(c_string_constant) \
&((const PascalString) { \
.Length=sizeof(c_string_constant)-1, \
.Data=(c_string_constant), \
})
, как предложено в этих вопросов , но это не работает, потому что Data
является гибким массивом: я получаю ошибку error: non-static initialization of a flexible array member
(с gcc, clangвыдает похожую ошибку).
Возможно ли это в C?И если да, то как будет выглядеть макрос PASCAL_STRING_CONSTANT?