为什么函数不需要extern,但变量确实如此

use*_*256 2 c++ variables function extern

对不起伙计我知道我的英语不好,但我做了一些例子,以便我的问题更加清晰.

a.cpp

#include <iostream>

using namespace std;

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

int varfoo = 10;
Run Code Online (Sandbox Code Playgroud)



b.cpp

#include <iostream>

using namespace std;

extern void funcfoo();

extern int varfoo;

int main(){

    funcfoo();

    cout << varfoo;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

我的问题是.为什么我在void funcfoo()之前删除"extern关键字"它工作正常,但是当我在int var foo之前删除extern关键字时出现错误?

Dav*_*eas 9

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


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