Ho un problema con la comprensione di alcune sintassi C++ in combinazione con i puntatori a funzione e le dichiarazioni di funzione, che è:Spiegazione dei puntatori a funzione
Di solito quando si vuole dichiarare un tipo di funzione che facciamo qualcosa di simile:
typedef void(*functionPtr)(int);
e questo va bene per me. D'ora in poi, functionPtr è un tipo, che rappresenta il puntatore alla funzione, che restituisce void e prende int con un valore come argomento.
Possiamo usarlo come segue:
typedef void(*functionPtr)(int);
void function(int a){
std::cout << a << std::endl;
}
int main() {
functionPtr fun = function;
fun(5);
return 0;
}
e otteniamo 5
stampata su uno schermo.
abbiamo il puntatore alla funzione fun
, assegniamo un puntatore alla funzione esistente - function
e eseguiamo questa funzione con un puntatore. Freddo.
Ora come ho letto in alcuni libri, la funzione e il puntatore alla funzione sono trattati in qualche modo uguali, quindi in effetti dopo la dichiarazione della funzione function()
ogni volta che diciamo funzione intendiamo funzione reale e puntatore per funzionare allo stesso tipo, quindi compila e ogni istruzione dà lo stesso risultato (5 stampate su uno schermo):
int main() {
functionPtr fun = function;
fun(5);
(*fun)(5);
(*function)(5);
function(5);
return 0;
}
Così ora il tempo che posso immaginare, che puntatori a funzioni e le funzioni sono praticamente la stessa, allora è in qualche modo bene per me .
Poi, però, se puntatore a funzione e la funzione reale è lo stesso, quindi perché non posso facciamo seguire:
typedef void(functionPtr)(int); //removed *
void function(int a){
std::cout << a << std::endl;
}
int main() {
functionPtr fun = function;
fun(5);
return 0;
}
Questo mi dà seguente errore:
prog.cpp:12:14: warning: declaration of 'void fun(int)' has 'extern' and is initialized functionPtr fun = function;
quindi ho capito, che per qualche motivo il compilatore ora capisce, che il divertimento è già esistente nella funzione. Poi ho provato a seguire:
E ho avuto errore di collegamento. In qualche modo capisco, che come il compilatore ora tratta il divertimento come funzione già esistente, quindi a causa del fatto che il divertimento non è definito da nessuna parte, avrò un errore di collegamento. Quindi ho cambiato il nome della variabile:
typedef void(functionPtr)(int);
void function(int a){
std::cout << a << std::endl;
}
int main() {
functionPtr function;
function(5);
return 0;
}
Così ora la funzione nelle ombre principali funzioni nome globale, in modo da function(5)
è utilizzato dalle dichiarazione functionPtr function;
funziona benissimo e stampe 5 sullo schermo.
Quindi ora sono scioccato. Perché è successo?Inoltre cosa ingannevole è, che quando puntatore a funzione è dichiarata in questo modo:
typedef void(*functionPtr)(int);
posso creare funzione del tipo functionPtr in modo seguente:
functionPtr function(int a){
std::cout << a << std::endl;
}
mentre, quando si dichiara qualcosa come:
typedef void(functionPtr)(int);
rende questo:
functionPtr function(int a){
std::cout << a << std::endl;
}
interpretato da un compilatore come funzione che restituisce la funzione. Se è così, perché la dichiarazione precedente (typedef void(functionPtr)(int);
) sapeva che questa è una funzione che restituisce il vuoto e non la funzione che restituisce functionPtr?
Qualcuno potrebbe spiegare cosa sta veramente accadendo per me?
Sto utilizzando il compilatore g ++ C++ con l'opzione C++ 14 abilitata.
questo codice non è stato compilato. Il pezzo di codice, cioè: 'functionPtr fun; fun (5); '(senza assegnazione) Qui il divertimento è visto come una funzione, che esiste da qualche parte, ma collegato non può vederlo, quindi ricevo errori di collegamento – DawidPi
Quindi, perché' typedef void (functionPtr) (int); 'è così e ho: functionPtr fun; divertimento(); Ottengo errori di collegamento? Vedi qui: https://ideone.com/e20FmU – DawidPi
@DawidPi A causa di, come SergeyA ha ben spiegato, quel codice non è corretto. Potrebbe funzionare solo nel caso pubblicato in questa risposta dove è implementata la funzione 'function'. Nel tuo caso il divertimento non lo è. – LPs