2013-09-29 13 views
5

なぜcstdlibをインクルードする必要はなく、どうすればこの機能を無効にできますか?私はそれ(またはsystem()を含むその一部)は<iostream>で含まれていたので、あなたは<cstdlib>を含める必要はありませんWindows 7の上でGCCコンパイラでインクルードなしでC++コードをコンパイルする

#include <iostream> 

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

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

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

'cstdlib'が' iostream'に含まれているようです。これは少なくともGCC 4.7.3の場合のようです。 – juanchopanza

+0

あなたの質問は、「あなたがXならあなたがYをすることができる」と書かれているとき、XをしていないとYがエラーになるという保証があるという一般的な(誤った)理解の一部と思われる。ほとんどの場合そうではありません。 Yが合法であることを証明する*ためには、まだXをしなければなりません。 –

答えて

7

をコード::ブロックを使用しています。それは、標準ヘッダーに含まれる他の(標準の)ヘッダーかどうか、または指定されていません。この動作を無効にすることはできませんが、異なる標準ライブラリ実装間の移植性の問題を避けるために、この動作を認識する必要があります。

この動作に依存せず、自分で<cstdlib>を含めるべきです。また、systemの代わりにstd::systemを使用する必要があります。 <c*>ヘッダーの関数は、std名前空間(グローバルなもの、<*.h>ヘッダー)にのみ存在することが保証されています。私はMSのVisual Studio 2012を使用して、それでい

4

、< iostream><xlocnum>が含ま<ios>含ま<ostream>含ま<istream>含まれています。あなたのプログラムが間接的に<cstdlib>

が含まので<xlocnum>は、<cstdlib>が含ま含みのシーケンスは、他のコンパイラおよび/または実装で異なるかもしれませんが、このコードが実行されることを理由に<iostream>、直接または間接的には<cstdlib>が含まれていることです。

iostreamに含まれるライブラリは実装固有であり、他のコンパイラではコードがコンパイルされないことに注意してください。原則として、ヘッダーファイルに含まれるライブラリは、通常はよく文書化されていないか、標準の一部ではないので、間接インクルードに依存しないでください。ライブラリが必要な場合は直接インクルードしてください。標準ライブラリはinclude guardedなので、プログラムのコンパイルや実行時にはoverheadという意味はありません。

+0

あなたは間接的な包含がすべての実装にそこに存在しなければならないように聞こえるようにします。これはそうではありません。 – juanchopanza

+0

少し具体的になりますか? – MxNx

+0

私は、 'iostream'が' cstdlib'を引き込まない可能性があることを意味しますが、常にそうであるようにあなたはそれをサウンドにします。 – juanchopanza

関連する問題