Est l'astérisque en option lors de l'appel d'un pointeur de fonction?

je ne pouvais pas trouver une réponse à ce n'importe où. Je viens de lire K&R et vu l'appel d'un pointeur de fonction comme ceci:

(*ptr)(arg1, arg2);

je me souviens très bien, cependant, d'avoir vu quelqu'un utiliser comme ceci:

ptr(arg1, arg2);

Qui peut avoir été en C++, si.

  • Comment sont les règles?
  • sont-ils différents en C et c++?
20
demandé sur Filip Roséen - refp 2014-05-30 21:39:03

2 réponses

TL;DR

les règles en C et c++ sont les mêmes, il n'y a pas de différence entre les deux.


Quelle est la Norme C++ ( n3797) dire?

5.2.2p1appel de fonction[expr.call]

un appel de fonction est une expression de postfix suivie de parenthèses contenant éventuellement un vide, liste séparée par des virgules initialiseur-clauses qui constituent les arguments de la fonction.

l'expression postfix doit avoir le type de fonction ou pointeur vers le type de fonction.


Quelle est la norme ( n1570) dire?

6.3.2.1p4Lvalues, les tableaux et les pointeurs de fonction

Une fonction designator est une expression qui a un type de fonction. Sauf quand il s'agit de l'opérande du sizeof opérateur _Alignof opérateur, ou unaire & opérateur une fonction de désignation de type de la fonction "retour tapez "est converti en une expression qui a le type" pointeur pour retourner la fonction tapez".

6.5.2.2p1Fonction appels

l'expression qui dénote la fonction appelée doit avoir le type pointeur pour la fonction retour void ou en retournant un type d'objet complet autre qu'un type de tableau.



Conclusion?

Comment la règle sont exprimés diffère entre C++ et C. C de l'implicite fonction de pointeur la conversion s'applique toujours en appelant une fonction, alors que C++ indique que le "postfix expression" peut être soit un pointeur ou une variable de type fonction.

Toutefois, votre question est de savoir si les deux façons de l'appel d'une fonction par le biais d'un pointeur diffère entre C++ et C, et la réponse est: Non, il n'y a pas de différence entre (1),(2) et (3), il n'y a pas non plus de différence entre les deux langue.

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

fptr(123);      // (2)

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

Remarque:: soyez conscient qu'il n'y a pas de différence entre (*fptr) (...) et fptr (...) quand il s'agit de l'appel d'une fonction, mais qu'ils peuvent être très différentes dans d'autres contextes.

15
répondu Filip Roséen - refp 2014-05-30 19:57:39

quelles sont les règles? Est-ce qu'ils diffèrent en C et c++?

Non. Dereferencing le pointeur de fonction dans ce contexte était jamais nécessaire, car il est redondant.

cependant, vous pouvez toujours utiliser l'astérisque-notation pour souligner que vous appelez une fonction à travers un pointeur de fonction. C'est peut-être aussi la raison pour laquelle l'auteur du snippet dans votre post.

3
répondu Columbo 2014-05-30 17:46:49