2013-09-29 19 views
5

Dlaczego nie muszę dołączać pliku cstdlib i jak to wyłączyć? Używam Code :: Blocks z kompilatora GCC na Windows 7.Kompilacja kodu C++ bez uwzględniania

#include <iostream> 

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

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

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

Wygląda na to, że 'cstdlib' jest zawarty przez' iostream'. Wydaje się, że tak jest przynajmniej w przypadku GCC 4.7.3. – juanchopanza

+0

Twoje pytanie wydaje się być częścią ogólnego (błędnego) zrozumienia, że ​​kiedy dokumentacja mówi "Jeśli robisz X, możesz zrobić Y", zakładasz, że masz gwarancję, że nie wykonywanie X powoduje, że Y jest błędem. Tak nie jest przez większość czasu. Nadal musisz zrobić X, aby * udowodnić, że Y jest zgodny z prawem. –

Odpowiedz

7

Nie trzeba zawierać <cstdlib> ponieważ (lub jego część, zawierająca system()) została uwzględniona przez <iostream>. Nie jest określone, czy i które inne (standardowe) nagłówki są zawarte w standardowych nagłówkach. Nie można wyłączyć tego zachowania, ale należy o tym pamiętać, aby uniknąć problemów z przenośnością między różnymi standardowymi implementacjami biblioteki.

Nie powinieneś polegać na tym zachowaniu i samemu dołączyć <cstdlib>. Powinieneś także użyć std::system zamiast globalnej system. Funkcje z nagłówków <c*> są gwarantowane tylko w przestrzeni nazw std (globalne z kolei w nagłówkach <*.h>).

4

używam MS Visual Studio 2012 i w nim, < iostream> obejmuje <istream> który obejmuje <ostream> który obejmuje <ios> który obejmuje <xlocnum>. <xlocnum> obejmuje <cstdlib>, więc program obejmuje pośrednio <cstdlib>

Chociaż sekwencja obejmuje mogą być różne w innych kompilatorów i/lub implementacji, że powodem tego jest to, że kod działa <iostream>, bezpośrednio lub pośrednio obejmuje <cstdlib>.

Należy zauważyć, że biblioteki, które obejmuje iostream, są specyficzne dla implementacji i kod może nie zostać skompilowany w innym kompilatorze. Zasadą jest, że biblioteki zawarte w pliku nagłówkowym zwykle nie są dobrze udokumentowane lub stanowią część standardów, więc nie należy opierać się na plikach pośrednich. Jeśli potrzebujesz biblioteki, dołącz ją bezpośrednio, a ponieważ biblioteki standardowe to include guarded, nie będzie żadnych znaczących overhead kompilacji programu lub jego pracy.

+0

Sprawiasz, że brzmi to tak, jakby pośrednia inkluzja musiała tam być we wszystkich implementacjach. Nie o to chodzi. – juanchopanza

+0

Będziesz trochę bardziej konkretny? – MxNx

+0

Mam na myśli to, że 'iostream' nie uruchamia' cstdlib', ale sprawiasz, że brzmi tak, jak zawsze. – juanchopanza

Powiązane problemy