2013-05-31 24 views
5

Quindi, ho questa domanda. Perché cout non gettaC++ cout fornisce l'identificatore non dichiarato

error C2065: 'cout' : undeclared identifier 

Sto usando Visual Studio 2012 come un IDE e sto scrivendo un progetto scolastico. Ho fatto tutto tranne un file di esempio. Così sto cercando di scrivere qualcosa sullo schermo come questo:

#include "iostream" 
#include "stdafx.h" 
using namespace std; 

int main() 
{ 
    cout<<"example"; 

    return 0; 
} 

Quindi il problema è con cout ... printf funziona bene, ma voglio utilizzare cout.

MODIFICA: Ho modificato "" a <> ma non sta aiutando. Inoltre sto usando questo codice solo per esempio ... Questo non è l'intero progetto.

+0

Prova '# include ' –

+0

E utilizzare 'std :: cout' o utilizzare lo spazio dei nomi. – Dirk

+4

Credo che l'intestazione precompilata debba essere la prima riga nella fonte. – chris

risposta

12

stdafx.h deve essere la prima direttiva di inclusione nel file di origine.

Cambia file e converti la seconda inclusione in <>, come suggerito da altri.

#include "stdafx.h" 
#include <iostream> 

Vedi this post per ulteriori informazioni.

+1

thx, l'ho appena scoperto da solo, ma tu sei l'unico con la correzione effettiva: D: D – Dekay

+0

@ user2440586, Per essere onesti, * è * molto meglio usare parentesi angolari quando si includono intestazioni standard. – chris

11

Prima di tutto:

#include <iostream> 

invece di #include "iostream"

In secondo luogo, è generalmente considerato una cattiva pratica di scrivere using namespace std;, anche se la maggior parte dei corsi iniziano con quella. E 'meglio usare solo ciò che è effettivamente necessario, nel tuo caso:

using std::cout;

+2

Non è necessario "Secondly". Usa già "using namespace std;" – Tik0

+2

oops, il mio male ... rimosso quello –

+0

La domanda è: perché fallisce quando "" cerca come <> quando fallisce. – chris

4
#include "iostream" 

dovrebbe essere

#include <iostream> 

Citando da questo post: difference-between-iostream-and-iostream-quotes-in-include

Per gentile concessione di @ Risposta di Jerry Coffin:

Quando si utilizza <>, il compilatore ricerca solo nelle directory/directory designate dal sistema (ad esempio, qualunque cosa sia stata impostata nella variabile di ambiente di inclusione) per l'intestazione.

Quando si utilizza "", il compilatore prima cerca nella directory locale e, se fallisce, esegue nuovamente la ricerca proprio come se fosse stato utilizzato <>. Tecnicamente, (vale a dire, secondo lo standard) che non deve essere la directory "locale", ma è così che funziona essenzialmente in ogni compilatore di cui sono a conoscenza).

EDIT:

Tuttavia, la causa principale è che stdafx.h è un'intestazione precompilata. Visual C++ non compilerà nulla prima del #include "stdafx.h" nel file di origine, a meno che l'opzione di compilazione /Yu'stdafx.h' non sia deselezionata (per impostazione predefinita); si assume che tutto il codice nella sorgente fino a includere tale riga sia già compilato. Tuttavia, è ancora meglio utilizzare <> con iostream per non confondere il lettore del codice.

+1

Il problema che vedo è che si contraddice la risposta con la citazione. I miei soldi sono sul problema PCH. – chris

+0

@chris Penso che l'ultima frase 'ma è così che funziona essenzialmente in ogni compilatore di cui sono a conoscenza 'di quotazione consolida la sua risposta. Sentiti libero di correggermi se la citazione inclusa non è corretta, grazie! – taocp

+0

Credo che faccia riferimento al fatto che "# include" nome "" cerca in un modo definito dall'implementazione prima di tornare a "#include ", ma ogni compilatore sano di mente guarda nella directory locale. – chris

1

Se si utilizza #include <iostream> con lo <> invece di "", allora dovrebbe funzionare. In questo momento, il compilatore non sa dove trovare la libreria iostream.

Inoltre, è possibile modificare cout<<"example"; a cout<<"example"<<endl; per una nuova riga in modo che venga formattato correttamente.

+2

Se si sta solo consigliando di aggiungere una nuova riga, si consiglia di aggiungere una nuova riga: '<< '\ n';'. Se stai anche avvisando di svuotare, dovresti indicarlo chiaramente. – BoBTFish