了解c ++中的extern

时间:2010-03-25 09:42:40

标签: c++ syntax extern

namespace std  
{ 
  extern istream cin;   
...
}

使用extern我们声明cin在其他单位中定义为the answer

但是,如果在istream中定义/未定义std,应该会有一些区别,对吧?

compilor有什么区别?

3 个答案:

答案 0 :(得分:2)

编译器不关心。如果未定义,链接器将无法将外部对象“链接”到真实对象。

答案 1 :(得分:1)

编译器通常会在发现您使用cin时发现错误,至少没有声明它。

使用extern,你可以告诉编译器“简单,容易,相信我,还有其他地方的声明和cin of class istream的定义。

然后链接器跳转到操作,并且对cin的使用的调用和对象本身之间的链接特别“待定”。链接器必须将所有这些调用与它们的目标联合起来,现在是cin存在与否(已编译或未编译)的事实具有其重要性。如果不是,则链接器失败。链接器提供的错误比编译器提供的错误要神秘得多,但它们很有趣,因为它们是一种非常好的学习方法。

例如,下面的代码不是 #include cstdio而不是stdio.h,但是我们知道printf会在那里,因为标准库总是与我们的程序链接。是的,它有效。

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

int main()
{
    printf( "Hello, world!\n" );
}

答案 2 :(得分: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