Механически макрос работает так, как его уже описали другие. С семантической точки зрения, вы можете думать об этом как о форме приведения от char *
s до String *
s.
Структура String
является заголовком подсчитанной строки, т. Е. Той, в которой вы знаете общую длину без необходимости поиска байта NUL. Эта конкретная версия также хранит общую сумму. Вы создали бы его следующим образом:
struct String *str = malloc(sizeof(*s) + maxlen);
str->length = 0;
str->capacity = maxlen;
str->checked = /* ??? */;
Где-то должно быть несколько различных функций, чтобы манипулировать этими подсчитанными строками.
Макрос сам по себе является хаком для перехода от простого char *
, который, как предполагается, указывает на первый символ a String
, как указано выше, обратно на String *
. Было бы использовано что-то вроде этого:
/* allocate str as above */
char *s = str->p;
Теперь, через цепочку вызовов или возвратов функций, вы каким-то образом теряете след структуры String, содержащей s
, и вам нужно найти ее снова. Вы пишете:
String *str2 = STRING(s);
Это не очень хороший способ реализации подсчитанной строки в C, но он демонстрирует технику, которую время от времени видят.