Я довольно новичок в программировании на C, и подобные вещи постоянно появляются. В качестве простого примера предположим, что у меня есть struct http_header
с некоторыми char
указателями:
struct http_header {
char* name;
char* value;
};
Я хочу заполнить http_header
, где value
- это строковое представление типа int. Я "чувствую", что семантически я должен быть в состоянии написать функцию, которая принимает пустой указатель заголовка, строку имени и int
и заполняет заголовок соответствующим образом.
void fill_header(struct http_header *h, char* name, int value)
{
h->name = name;
char *value_str = malloc(100);
sprintf(value_str, "%d", value);
h->value = value_str;
}
int main(int argc, const char * argv[])
{
struct http_header h;
char *name = "Header Name";
int val = 42;
fill_header(&h, name, val);
...
free(h.value);
}
Здесь вызывающий код читается точно так же, как и мои намерения, но в этом случае я создаю строку value
динамически, что означает, что мне придется ее позже освобождать. Это не пахнет мне; кажется, что вызывающая сторона тогда слишком много знает о реализации fill_header
. А в реальных реализациях может быть не так просто узнать, что нужно освободить: рассмотрите возможность заполнения массива http_header
s, где только один из них должен иметь свое значение malloc
ed.
Чтобы обойти это, мне нужно заранее создать строку:
void fill_header2(struct http_header *h, char* name, char *value_str)
{
h->name = name;
h->value = value_str;
}
int main(int argc, const char * argv[])
{
struct http_header h;
char *name = "Header Name";
int value = 42;
char value_str[100];
sprintf(value_str, "%d", value);
fill_header2(&h, name, value_str);
}
Поскольку этот паттерн продолжается по цепочке структур с указателями на другие структуры, я заканчиваю тем, что выполняю так много работы с функциями верхнего уровня, что функции нижнего уровня вряд ли стоят этого. Кроме того, я, по сути, пожертвовал идеей «заполнить заголовок int
», которую я намеревался написать в первую очередь. Я что-то здесь упускаю? Есть ли какой-нибудь шаблон или дизайн, который облегчит мою жизнь и , чтобы мои вызовы функций отражали мои намерения?
P.S. Спасибо всем в Stackoverfow за то, что я был лучшим профессором, которого я когда-либо имел.