2

对不起,伙计们,我知道我的英语不好,但我举了一些例子,这样我的问题就更清楚了。

a.cpp

#include <iostream>

using namespace std;

void funcfoo(){
    cout << "test only" << endl;
}

int varfoo = 10;



b.cpp

#include <iostream>

using namespace std;

extern void funcfoo();

extern int varfoo;

int main(){

    funcfoo();

    cout << varfoo;

    return 0;
}

然后我像这样编译它“cl b.cpp a.cpp”

我的问题是。当我在 void funcfoo() 之前删除“extern 关键字”时它工作正常,但是当我在 int var foo 之前删除 extern 关键字时,我得到了一个错误。

4

4 回答 4

9

问题在于每一行代码的含义。int varfoo是一个变量的定义,而void funcfoo()只是一个声明。您可以提供多个实体的声明,但只能提供一个定义。提供声明且仅声明变量的语法是通过添加extern关键字:extern int varfoo;声明


3.1 [basic.def]/2 声明是一个定义,除非它声明一个函数而不指定函数体 (8.4),它包含 extern 说明符 (7.1.1) 或链接规范25 (7.5),既不是初始化程序,也不是一个函数体 [...]

于 2012-08-27T17:01:10.973 回答
3

当您extern从中删除时,extern void funcfoo();您将向前声明它,因此您下面的代码将知道是什么funcfoo()。如果您要对变量执行此操作,您实际上会实例化它并且会与您的其他文件发生冲突。因此,extern它是说“它存在,相信我;)”它是从您的其他文件中解决的。

于 2012-08-27T17:00:43.687 回答
0

另一种思考方式是,当您执行 int varfoo 时,分配内存来保存变量,因此它既是定义又是声明,当您执行 int foo() 时,函数被声明但未定义,因此在某种程度上内存未分配。对于函数,默认情况下链接是外部的,因此删除它并不重要,但对于变量,如果你说 extern int varfoo 编译器不会为它分配内存——它会假设变量是在其他地方定义的。

于 2012-08-31T15:21:24.710 回答
0

I know this might be late, but I hope this helps in some way. Check the link below and it ll give an idea of what extern is and how it works.

http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/

Thank you

于 2014-02-16T13:13:08.663 回答