Questa domanda è nata da una programmazione in misti. Ho avuto una routine Fortran che volevo chiamare dal codice C++. Fortran passa tutti i suoi parametri per riferimento (a meno che tu non lo dica diversamente).In che modo i compilatori C++ passano effettivamente i parametri di riferimento?
così ho pensato che sarei intelligente (brutta partenza proprio lì) nel mio codice C++ e definire il Fortran qualcosa di routine, come questo:
extern "C" void FORTRAN_ROUTINE (unsigned & flag);
Questo codice ha funzionato per un po ', ma (ovviamente ragione quando Avevo bisogno di partire) improvvisamente ha iniziato a saltare su una chiamata di ritorno. Chiara indicazione di una pila di chiamate mungite.
un altro ingegnere è venuto dietro di me e ha risolto il problema, dichiarando che la routine avevano da definire in C++ come
extern "C" void FORTRAN_ROUTINE (unsigned * flag);
mi piacerebbe accettare che ad eccezione di due cose. Uno è che sembra piuttosto contro-intuitivo per il compilatore di non passare i parametri di riferimento come riferimento, e non trovo documentazione da nessuna parte che lo dice. L'altro è che ha cambiato un'intera serie di altri codici nello stesso momento, quindi teoricamente avrebbe potuto essere un altro cambiamento che risolveva qualsiasi problema.
Quindi la domanda è: in che modo C++ passa effettivamente i parametri di riferimento? È forse libero di fare copia, copia per piccoli valori o qualcosa del genere? In altre parole, i parametri di riferimento sono assolutamente inutili nella programmazione in linguaggio misto? Mi piacerebbe saperlo, così non commetterò mai più lo stesso errore di codice.
i riferimenti e i puntatori sono la stessa cosa quando si supera la fase di convalida: http://stackoverflow.com/questions/1640355/whats-the-low-level-difference-between-a-pointer-an-a- riferimento –
@CrazyJugglerDrummer: Da quello che ho letto lì, la risposta è in realtà "non necessariamente, ma con la maggior parte dei compilatori oggi sì". Direi che è la stessa domanda della mia, tranne che ho aggiunto la ruga di avere la routine in questione definita come "extern" C "'. Questo forse li rende magicamente uguali? –