Vraag Is het sterretje optioneel bij het aanroepen van een functiewijzer?


Ik kon nergens een antwoord op vinden. Ik heb net K & R gelezen en zag dat ze een functie-aanwijzer als deze noemden:

(*ptr)(arg1, arg2);

Ik herinner me echter levendig dat ik iemand deze op deze manier heb zien gebruiken:

ptr(arg1, arg2);

Dat was misschien in C ++.

  • Hoe zijn de regels?
  • Verschillen ze in C en C ++?

20
2018-05-30 17:39


oorsprong


antwoorden:


TL; DR

De regels in C en C ++ zijn hetzelfde, er is geen verschil tussen de twee.


Wat doet de C ++-standaard (n3797) zeggen?

5.2.2p1  Functieaanroep  [expr.call]

Een functieaanroep is een postfix-uitdrukking gevolgd door haakjes     met een mogelijke lege, door komma's gescheiden lijst van     initializer-clausules die de argumenten voor de functie vormen.

De postfix-expressie heeft een functietype of pointer naar het functietype.


Wat doet de C-standaard (n1570) zeggen?

6.3.2.1p4  Lvalues, arrays en functie-aanduidingen

Een functie-aanduiding is een uitdrukking met een functietype. Behalve wanneer het de operand van de. Is sizeof operator, de _Alignof operator of de unary & operator, een functie-aanduiding met type "functie terug" type"wordt geconverteerd naar een expressie die het type" pointer naar functie retourneert " type".

6.5.2.2p1  Functieaanroepen

De uitdrukking die de opgeroepen functie aangeeft, heeft de functie pointer to function terugkerende void of het retourneren van een compleet objecttype anders dan een arraytype.



Conclusie?

Hoe de regel wordt uitgedrukt, verschilt tussen C ++ en C. In C is de impliciete functie-to-pointer conversie is altijd van toepassing wanneer een functie wordt aangeroepen, terwijl C ++ aangeeft dat de "postfix-expressie" kan een aanwijzer zijn of een variabele van het functietype.

Echter; uw vraag is of de twee manieren om een ​​functie aan te roepen via een aanwijzer verschilt tussen C ++ en C, en het antwoord is: Nee, er is geen verschil tussen (1), (2), en (3), noch is er een verschil tussen de twee talen.

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

fptr(123);      // (2)

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

Notitie: Houd er rekening mee dat er geen verschil is tussen (*fptr) (...) en fptr (...) als het gaat om het aanroepen van een functie, maar dat ze in andere contexten enorm kunnen verschillen.


15
2018-05-30 17:53



Hoe zijn de regels? Verschillen ze in C en C ++?

Nee. Dereferencing van de functie pointer in deze context was nooit noodzakelijk, omdat het overbodig is.

U wilt echter mogelijk nog steeds de asterisk-notatie gebruiken om te onderstrepen dat u een functie aanroept via een functiewijzer. Dat kan ook de reden zijn voor de auteur van het fragment in uw bericht.


3
2018-05-30 17:46