Sto cercando di capire meglio come si strutturerebbe un'API in C.
- creo una struct
Person
- Ho una funzione
init
che imposta i dati su quella struttura - Ho più funzioni "helper" che funzionano su quella struttura
Mi chiedo se il seguente codice in C possa essere considerato idiomatico dal punto di vista di sviluppatori C più esperti.
#include <stdio.h>
#include <stdlib.h>
typedef struct Person Person;
struct Person
{
unsigned int age;
unsigned int weight;
Person *next_person;
};
void person_init(Person *p, unsigned int age, unsigned int weight, Person *next_person)
{
p->age = age;
p->weight = weight;
p->next_person = next_person;
}
void person_print(Person *p)
{
printf("person is %dy old\n", p->age);
printf("person weight is %dkg\n", p->weight);
}
int main(void)
{
Person p1, p2, p3, p4;
Person *p_cur;
person_init(&p1, 28, 80, &p2);
person_print(&p1);
person_init(&p2, 58, 93, &p3);
person_print(&p2);
person_init(&p3, 60, 60, &p4);
person_print(&p3);
person_init(&p4, 78, 50, NULL);
person_print(&p4);
printf("==================\n");
p_cur = &p1;
while (p_cur != NULL) {
person_print(p_cur);
p_cur = p_cur->next_person;
}
return 0;
}
In particolare, non sono sicuro della firma delle funzioni in generale e dell'uso di un puntatore Person *
.
Quando va bene non passare un puntatore ma direttamente la struct / char array?
Nella maggior parte delle API che ho visto finora, viene passato un puntatore all'array struct / char, come snprintf(char * s, ... )
. Ma a volte, come in getline(char **lineptr, ...)
, viene passato anche un char **
. Perché? Quando fai la distinzione?