Указатели на функции C - PullRequest
       1

Указатели на функции C

1 голос
/ 29 апреля 2011
static void increment(long long *n){
  (*n)++;
}

struct test{
  void (*work_fn)(long long *);
};

struct test t1;

t1.work_fn = increment;

Как я на самом деле вызываю функцию сейчас?t1.work_fn (& n)?

Ответы [ 3 ]

3 голосов
/ 29 апреля 2011

Как мне теперь вызвать функцию? t1.work_fn(&n)?

Это будет отлично работать.

Указатели на функции не нужно явно разыменовывать. Это потому, что даже при обычном вызове функции (с использованием фактического имени функции) вы действительно вызываете ее через указатель на функцию. C99 6.5.22 «Вызовы функций» говорит (выделено мое):

Выражение, обозначающее вызываемую функцию (сноска 77) , должно иметь указатель типа на функцию , возвращающий void или возвращающий тип объекта, отличный от типа массива

Сноска 77:

Чаще всего это результат преобразования идентификатора, который является указателем функции.

Обратите внимание, что вы все еще можете разыменовать указатель функции (или обычное имя функции - хотя я думаю, что это может вызвать путаницу) для вызова функции, поскольку C99 6.5.3.2/4 "Address и косвенные операторы "говорит:

Унарный * оператор обозначает косвенность. Если операнд указывает на функцию, результатом является обозначение функции

Таким образом, все они в конечном итоге будут делать одно и то же (хотя компилятор может и не оптимизировать сквозные вызовы t1.work_fn):

t1.work_fn(&n);
(*t1.work_fn)(&n);

increment(&n);
(*increment)(&n);
3 голосов
/ 29 апреля 2011

Вы можете назвать его как t1.work_fn(&n) или (*t1.work_fn)(&n), в зависимости от того, что вы предпочитаете.

Симметрично, при назначении указателя вы можете сделать либо t1.work_fn = increment, либо t1.work_fn = &increment. Опять же, это вопрос стиля персонального кодирования.

Вероятно, можно утверждать, что ради последовательности следует придерживаться "минималистического" стиля

t1.work_fn = increment;
t1.work_fn(&n);

или в "максималистском" стиле

t1.work_fn = &increment;
(*t1.work_fn)(&n);

но не сочетание двух, чтобы мы могли иметь четко определенные священные войны между двумя отличительными лагерями вместо четырех.

P.S. Конечно, «минималистичный» стиль - единственный правильный. И надо заколоть яйца заостренным концом.

0 голосов
/ 29 апреля 2011

Да, вот как это назвать.Имена функций и переменные, содержащие указатели функций, по сути, одно и то же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...