Sto leggendo "Il linguaggio di programmazione C++ - Quarta edizione" e stavo scrivendo un semplice esercizio solo per ottenere un blocco della sintassi C++ e per sbaglio mi sono imbattuto in qualcosa che mi ha fatto alzare un sopracciglio. In breve, ho dimenticato di aggiungere ()
su accept
nella principale:Avviso chiamata mancata lista argomento chiamata
bool accept()
{
cout << "Do you want to proceed (y or n)?\n";
char answer = 0;
cin >> answer;
if (answer == 'y')
{
return true;
}
return false;
}
int main()
{
accept;
}
Questo corre e compilazione e produce (in VS2015) un
C4551 - lista degli argomenti funzione di chiamata mancante
Mi sono trovato a leggere e una serie di domande su SO che dovrebbero essere chiuse perché in genere chiedono di "eseguire il debug del mio codice".
Ho pensato che se il codice viene compilato ed eseguito, e la funzione contiene un'istruzione di blocco (in attesa di input dell'utente) e un tipo di ritorno, che tutto il codice verrebbe eseguito come previsto a prescindere dalla mancanza delle parentesi; non è questo il caso però.
Inoltre, ho pensato che vorrei cambiare la chiamata a accept
in principale, per bool a = accept; cout << a;
per cercare di prevenire qualsiasi ottimizzazione (se questo era quello che stava realmente accadendo), e che non ho chiamato il codice accept()
sia.
Cosa Sono curioso di sapere è:
- Qual è la chiamata a farsi
accept
compilato in? - Perché non è il codice in
accept
sempre chiamato - Perché questo è solo un avviso, e non un errore (So di poter cambiare la configurazione per visualizzarla come errore, io sono più in modo da mettere in discussione come questo è accettato sintassi per impostazione predefinita quando il risultato effettivo differisce dal risultato previsto in modo "drammatico?" Questa domanda potrebbe essere basata sull'opinione pubblica, ometterla se si è d'accordo.)
- L'esecuzione del codice
bool a = accept; cout << a;
nella principale produce1
come output. Come può essere questo quandofalse
è il valore bool predefinito (almeno in C#) e non c'è nulla per restituire un valore vero poiché il codice di accettazione non viene eseguito?
Eventuali duplicati di [Perché l'compilatore C++ si lamentano quando uso le funzioni senza parentesi?] (Http://stackoverflow.com/questions/11082329/why-doesnt-the-c-compiler-complain -quando-i-uso-funzioni-senza-parentesi) e http://stackoverflow.com/questions/17073066/g-calling-function-without-parenthesis-not-f-but-f-why-always-return –
@ HithamS.AlQadheeb: Mentre è vicino, chiede un paio di altre cose che hanno a che fare con i puntatori di funzione e decadendo in 'bool'. Quindi non è un duplicato completo. –
@ HithamS.AlQadheeb la risposta nel "duplicato" risponde solo a una parte della mia domanda. Il titolo della domanda "duplicato" è esattamente l'esatto opposto di quello che stavo vivendo, poiché il mio compilatore stava dando l'avvertimento, quindi io usavo il testo di avvertimento come titolo della domanda così è facilmente reperibile nelle ricerche quando gli altri si imbattono nello stesso avvertimento. Le altre domande che usano il mio stesso titolo chiedono "perché il mio codice non funziona", quindi potrebbe essere più utile chiuderle contro chi chiude la mia Q quando il "dupe" che hai trovato è (beh non è un capriccio, e) a malapena ricercabile. – Kcvin