Антон Долганин

Я инженер, который решает задачи, а не пишет на языке. Архитектура, разработка, DevOps — подбираю инструменты под цель, строю решения, которые работают в проде и масштабируются без боли.

📌 Проблема

В С часто нужно хранить строки вместе с их длиной. 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;
}

Удобно в сетевых протоколах, логах, бинарных форматах — строка + размер всегда под рукой, нулевой оверхед.

Строка + длина: трюк без оверхеда в C