© Anton Dolganin 2025
📌 Проблема
В С
часто нужно хранить строки вместе с их длиной. strlen()
на каждом вызове — лишние проходы по памяти. Хочется компактно и безопасно.
✅ Решение
Маленький трюк с typedef + макросом:
typedef struct { const char *p; size_t n; } sv;
#define SV(s) { (s), sizeof(s) - 1 }
struct Messages {
sv error, version, rep_prefix;
};
static const struct Messages mess = {
SV("error"),
SV("version"),
SV("Server reply: ")
};
После раскрытия препроцессором:
static const struct Messages mess = {
{ ("error"), sizeof("error") - 1 },
{ ("version"), sizeof("version") - 1 },
{ ("Server reply: "), sizeof("Server reply: ") - 1 }
};
— строка и её длина без лишних вычислений.
Применение
#include <stdio.h>
int main(void) {
fwrite(mess.rep_prefix.p, 1, mess.rep_prefix.n, stdout);
fwrite("OK\n", 1, 3, stdout);
return 0;
}
Удобно в сетевых протоколах, логах, бинарных форматах — строка + размер всегда под рукой, нулевой оверхед.
© Anton Dolganin 2025