Подтвердить что ты не робот

Является ли звездочка необязательной при вызове указателя на функцию?

Я нигде не мог найти ответ. Я просто прочитал K & R и увидел, что они вызывали указатель на функцию следующим образом:

(*ptr)(arg1, arg2);

Я живо помню, однако, что кто-то использовал их так:

ptr(arg1, arg2);

Возможно, это было на С++.

  • Как правила?
  • Различаются ли они на C и С++?
4b9b3361

Ответ 1

TL; DR

Правила в C и С++ одинаковы, между ними нет разницы.


Что означает стандарт С++ (n3797)?

5.2.2p1 Вызов функции [expr.call]

Вызов функции - это постфиксное выражение, за которым следуют скобки   содержащий возможный пустой, разделенный запятыми список   initializer-clauses, которые составляют аргументы функции.

     

Постфиксное выражение должно иметь тип функции или указатель на тип функции.


Что означает стандарт C (n1570)

6.3.2.1p4 Lvalues, массивы и указатели функций

Обозначение функции - это выражение, имеющее тип функции. За исключением случаев, когда он является операндом оператора sizeof, оператор _Alignof или унарный оператор &, обозначение функции с типом возвращаемого типа типа преобразуется в выражение с указателем типа для функции возвращаемого типа.

6.5.2.2p1 Вызов функций

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



Заключение

Как правило выражается, различаются между С++ и C. В C неизменное преобразование между строками всегда применяется при вызове функции, тогда как в С++ указано, что выражение postfix может быть либо указателем, либо переменной тип функции.

Тем не менее; ваш вопрос в том, что два способа вызова функции через указатель различаются между С++ и C, и ответ таков: Нет, нет разницы между (1), (2) и (3), и нет разницы между этими двумя языками.

(*fptr)(123);   // (1)

fptr(123);      // (2)

(***fptr)(123); // (3)

Примечание. Имейте в виду, что нет разницы между (*fptr) (...) и fptr (...), когда дело доходит до вызова функции, но что они могут быть значительно разными в других контекстах.

Ответ 2

Как правила? Различаются ли они на C и С++?

Нет. Разделение указателя функции в этом контексте было никогда, поскольку оно избыточно.

Однако вы все равно можете использовать звездочку, чтобы подчеркнуть, что вы вызываете функцию через указатель функции. Это также может быть причиной для автора фрагмента в вашем сообщении.