В этом случае преимущество наличия указателя на структуру состоит в том, что при создании рабочих функций вы обычно используете указатели на функции.Создание указателей на функции с аргументом с неопределенным номером и типом аргумента возможно, но я бы не рекомендовал это делать.
Например, если мы посмотрим на pthread_create
, его прототип будет:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
Здесь start_routine
- рабочая функция, а arg
- передаваемые ей аргументы.Было бы почти невозможно создать каркас, который легко использовать без этого метода.
В чем разница между передачей отдельных аргументов или указателя на структуру аргументов типа?Стоит ли ожидать какой-либо разницы?Когда мне следует выбрать тот или иной вариант?
Как вы видели в приведенном выше примере, если вы хотите использовать pthread
, вам просто нужно использовать структуры.
Другое использованиеесли вы хотите скрыть детали реализации для программиста.Это как бы имитирует ООП.Подумайте над тем, чтобы иметь этот заголовок:
// foobar.h
struct data;
int getId(struct data *data);
void setId(struct data *data, int id);
Теперь по какой-то причине вы не хотите, чтобы программист обращался к полям в data
напрямую.Поэтому мы скрываем его реализацию в исходном файле:
// foobar.c
struct data {
int id;
// More fields
}
int getId(struct data *data) {
return data->id;
}
void setID(struct data *data, int id) {
data->id = id;
}
Аналогичные рассуждения можно использовать для рабочей функции.
Третья причина может заключаться в том, что вам нужно передать LOTS или аргументы.Тогда это может улучшить читаемость, вместо этого использовать структуру.