2013-09-29 8 views
5

Perché non è necessario includere cstdlib e come disabilitarlo? Sto usando Code :: Blocks con il compilatore GCC su Windows 7.Il codice C++ compila senza includere

#include <iostream> 

using std::cout; 
using std::endl; 

int main() 
{ 
    cout << "Hello" << endl; 

    system("pause"); 
    return 0; 
} 
+0

Sembra che 'cstdlib' sia incluso da' iostream'. Questo sembra essere il caso di GCC 4.7.3 almeno. – juanchopanza

+0

La tua domanda sembra essere parte di una generale (errata) comprensione del fatto che quando una documentazione dice "Se fai X, puoi fare Y", assumi che hai la garanzia che non fare X causa un errore. Non è il caso per la maggior parte del tempo. Devi ancora fare X per * provare * che Y è legittimo. –

risposta

7

Non è necessario includere <cstdlib> perché (o la parte di esso che contiene system()) è stato incluso dal <iostream>. Non è specificato se o quali altre intestazioni (standard) siano incluse nelle intestazioni standard. Non è possibile disattivare questo comportamento, ma occorre tenerne conto per evitare problemi di portabilità tra diverse implementazioni di libreria standard.

Non si deve dipendere da questo comportamento e includere <cstdlib> da soli. È inoltre necessario utilizzare std::system anziché il numero globale system. Le funzioni delle intestazioni <c*> sono garantite solo nello spazio dei nomi std (quelle globali, d'altra parte, nelle intestazioni <*.h>).

4

sto utilizzando MS Visual Studio 2012 e in essa, < iostream> include <istream> che comprende <ostream> che comprende <ios> che comprende <xlocnum>. <xlocnum> include <cstdlib>, in modo che il programma include indirettamente <cstdlib>

Anche se la sequenza delle comprende potrebbe essere diverso in altri compilatori e/o implementazioni, la ragione per cui questo codice viene eseguito è che <iostream>, direttamente o indirettamente, include <cstdlib>.

Si noti che le librerie incluse in iostream sono specifiche dell'implementazione e che il codice potrebbe non essere compilato in qualche altro compilatore. Come regola generale, le librerie che include un file di intestazione non sono in genere ben documentate o parte degli standard, quindi non fare affidamento su include indiretti. Se hai bisogno di una libreria, includila direttamente e, poiché le librerie standard sono include guarded, nessuna significativa overhead verrà applicata alla compilazione o al tempo di esecuzione del tuo programma.

+0

Lo fai sembrare che l'inclusione indiretta debba essere presente in tutte le implementazioni. Questo non è il caso. – juanchopanza

+0

Sarai un po 'più specifico? – MxNx

+0

Voglio dire che è possibile che 'iostream' non spinga' cstdlib', ma lo fai sembrare come sempre. – juanchopanza

Problemi correlati