对不起家伙我知道我的英语不好,但我做了一些例子,以便我的问题更清楚。
的 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之前我得到一个错误?
答案 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/
谢谢