2014-05-24 13 views
10

mi piacerebbe capire qual è la differenza tra i 2 dichiarazioni, f1 e f2, al di sotto: In f1 dichiaro il parametro di essere un puntatore a una funzione di tipo void(), come è la dichiarazione f2 diverso dal f1 ? Le dichiarazioni sono equivalenti? In main posso richiamare entrambi con le funzioni del prototipo void(). Capisco il concetto di passare per valore/puntatore/riferimento, tuttavia queste sono funzioni e non capiscono veramente la differenza. Non è che io possa "modificare" la funzione passata come parametro in f1 ... Grazie!Puntatore per il funzionamento del parametro parametro vs funzione?

PS: è venuto da questa domanda quando sbattere contro il ben noto problema più fastidiosi di analisi :)

#include <iostream> 

using namespace std; 

void f1(void (*x)()) 
{ 
    x(); 
} 

void f2(void x()) 
{ 
    x(); 
} 

void g1() 
{ 
    cout << "Invoking f1(g1())" << endl; 
} 

void g2() 
{ 
    cout << "Invoking f2(g2())" << endl; 
} 


int main() 
{ 
    f1(g1); 
    f2(g2); 
} 

Il programma viene compilato e l'uscita è

Invoking f1(g1()) 
Invoking f2(g2()) 
+0

Grazie a tutti, capito :) – vsoftco

risposta

7

Sono equivalenti. Ti stai confondendo con la conversione implicita del puntatore che si verifica con gli argomenti.

Poiché non è possibile passare una funzione come argomento a una funzione (non è possibile eseguire operazioni con funzioni in C diverse da chiamarle o prendere il proprio indirizzo), il compilatore modifica silenziosamente l'argomento in un puntatore a un funzione.

Questo è lo stesso che accade con gli array: non è possibile passare gli array come argomenti di funzione, quindi ogni volta che si dichiara un argomento di funzione come un array, esso viene automaticamente modificato in un puntatore.

+0

Ok, grazie, sapevo che era quello che stava succedendo con gli array, tuttavia non sapevo nulla sulla funzione. Molte grazie, accetterò la tua risposta in quanto era leggermente più veloce :) – vsoftco

2

Sono sintassi alternativa per la stessa identica cosa. In entrambi i casi viene passato un puntatore a funzione, ma è possibile utilizzare la sintassi non puntatore nell'elenco dei parametri. L'uso di un nome di funzione decadere sempre su un puntatore alla funzione (e questo può accadere in modo ricorsivo).

13

Sia in C che in C++, se si dichiara un parametro di funzione con tipo di funzione, il relativo tipo verrà regolato sul puntatore della funzione.

C99, §6.7.5.3/8

Una dichiarazione di un parametro come '' funzione tipo ritorno '' è regolata per '' puntatore funzione tipo ritorno '', come in 6.3. 2.1.

C++ 11, §8.3.5/5

... Dopo determinare il tipo di ciascun parametro, ogni parametro di tipo “vettore di T” o “funzione che restituisce T” è rettificato per essere “puntatore a T” o “puntatore a funzione che restituisce T”, rispettivamente ...

così, in C++, per esempio, possiamo scrivere i tipi di entrambi f1 e f2 come void(void(*)()).

+0

Grazie per aver sottolineato il paragrafo significativo dello standard! – vsoftco

Problemi correlati