namespace std
{
extern istream cin;
...
}
使用extern
我们声明cin
在其他单位中定义为the answer
但是,如果在istream
中定义/未定义std
,应该会有一些区别,对吧?
compilor有什么区别?
答案 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