为什么函数不需要extern,但变量呢

时间:2012-08-27 16:57:53

标签: c++ function variables extern

对不起家伙我知道我的英语不好,但我做了一些例子,以便我的问题更清楚。

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关键字“它工作正常,但当我删除extern关键字 在int var foo之前我得到一个错误?

4 个答案:

答案 0 :(得分:9)

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


  

3.1 [basic.def] / 2声明是一个定义,除非声明一个函数而没有指定函数的主体(8.4),它包含extern说明符(7.1.1)或linkage-specification25(7.5)初始化者也不是函数体[...]

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我知道这可能会迟到,但我希望这会有所帮助。检查下面的链接,它将了解extern是什么以及它是如何工作的。

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

谢谢