1
namespace std  
{ 
  extern istream cin;   
...
}

を使用して、他のユニットで定義されていることを答えexternとして宣言しますcin

しかし、istreamで定義済み/未定義の場合はstd、違いがあるはずですよね?

コンパイラの違いは何ですか?

4

3 に答える 3

2

コンパイラは気にしません。外部オブジェクトが未定義の場合、リンカは外部オブジェクトを実際のオブジェクトに「リンク」できません。

于 2010-03-25T09:44:48.430 に答える
1

コンパイラは通常、少なくとも宣言せずに cin を使用していることを検出してエラーを出します。

extern を使用すると、コンパイラに「簡単、簡単、信頼してください。istream クラスの cin の宣言と定義が別の場所にある」と伝えることができます。

次に、リンカが動作を開始し、cin の使用への呼び出しとオブジェクト自体の間のリンクが特別に「保留中」になります。リンカーは、これらすべての呼び出しを宛先に結合する必要があり、現在、cin が存在するかどうか (コンパイルされているかどうか) が重要になります。そうでない場合、リンカーは失敗します。リンカーによって提供されるエラーは、コンパイラによって提供されるものよりもはるかに不可解ですが、学習するための非常に良い方法であるため、調査するのは興味深いものです。

たとえば、次のコードはstdio.h ではなく cstdio を#includeしていませんが、標準ライブラリが常にプログラムにリンクされているため、printf が存在することはわかっています。はい、動作します。

extern int printf(const char *, ...);

int main()
{
    printf( "Hello, world!\n" );
}
于 2010-03-25T09:56:39.623 に答える
0

コンパイラはそれistreamが型であることを認識している必要があり、externキーワードを使用して、std::cin存在し、その型であることを伝えます。コンパイラがその行を確認するまでに型として宣言されていない場合istream、型ではないことを知らせるエラーが表示されます。

//extern type var; // error 'type' unknown at this point
class type;
extern type var;   // ok:'type' is a class even if not fully declared
于 2010-03-25T09:56:54.070 に答える