Я хотел бы создать struct
в C99, который инкапсулирует строковый буфер с нулевым символом в конце вместе с фактической длиной строки:
typedef unsigned int uint_t;
typedef unsigned char uchar_t;
typedef struct {
uchar_t * buffer;
uint_t length; // excluding null-terminating character
} string_t;
Однако я столкнулся с рядом трудностей, связанных с вращением const
количество членов struct
.В частности, когда я хочу использовать функцию, которая принимает такую const struct string_t
, и передать ее инициализатором с константными членами, компилятор кричит на меня.
void show_string_internal(const string_t str) {
printf("%s", str.buffer);
}
void show_string(const uchar_t * buffer, uint_t length) {
const string_t str = // <== tricky assignment here
(const string_t){ buffer, length };
show_string_internal(str);
}
int main() {
uchar_t message[] = "Hello, world.";
show_string(message, sizeof(message) - 1);
return 0;
}
Выдает предупреждение над выделенной строкой как в GCC ...:
предупреждение: инициализация отбрасывает квалификатор const из целевого типа указателя
... и в Visual Studio 2015:
предупреждение C4090: «инициализация»: разные квалификаторы «const»
Видимо, я что-то делаю не такВот.Единственный способ обойти это - объявить:
typedef struct {
const uchar_t * buffer;
const uint_t length;
} const_string_t;
Но теперь у меня есть два типа вместо одного, поэтому мне нужно создать удобные способы преобразования между ними, и я 'Я создаю декларативный сахар вместо использования языковых возможностей, поэтому код менее читабелен.
Поэтому мой вопрос таков, как гласит заголовок: есть ли способ инициализировать const
struct
с использованием const
переменные для членов?Есть ли альтернативный способ достижения результатов, которых я хочу достичь?Если нет, то почему (пожалуйста, включите ссылки на официальную документацию)?
Буду признателен за любую помощь.