这是来自<iostream>
:
namespace std
{
extern istream cin; ///< Linked to standard input
extern ostream cout;
...
似乎通过使用extern
其他命名空间中定义的数据类型将可用?
extern
表示“这些变量是在其他一些编译单元(.cpp 或 .lib 文件)中定义的”
在这种情况下,你#include <iostream>
进入你的 .cpp 文件,并且因为cin
和cout
被声明为extern
,编译器会让你毫无怨言地使用它们。然后,当链接器运行时,它会查找所有extern
变量并对其进行排序。
extern
用于引用在不同编译单元中定义的变量(现在,您可以将编译单元视为 .cpp 文件)。您的示例中的语句声明而不是定义 cin
and cout
。它告诉编译器这些对象的定义是在另一个编译单元中找到的(它们没有被声明为extern
)。
不,这是一种明确的说法cin
,并且cout
在没有实际定义它们的情况下被声明。
extern关键字告诉编译器一个变量是在另一个源中声明的(即在当前范围之外)。链接器然后找到这个实际声明并设置extern变量以指向正确的位置。
extern语句声明的变量不会为它们分配任何空间,因为它们应该在别处正确定义。如果一个变量被声明为extern,并且链接器没有发现它的实际声明,它将显示错误。
例如。外部国际我;
//这声明有一个名为 i 的 int 类型的变量,定义在程序的某处。
一些答案在这里说 extern 意味着该变量是在其他编译单元中定义的。然后,以下不应该编译,因为没有其他编译单元或文件提供给编译器。
extern int a;
int main(){
std::cout<<a<<std::endl; //Prints 3
}
int a=3;
因此,我认为 extern 被明确用于分隔声明和定义,以防出现变量,如答案之一所述。我认为在功能的情况下它是无用的。