【问题标题】:why function didnt need extern, but variable does为什么函数不需要外部,但变量需要
【发布时间】:2012-08-27 16:57:53
【问题描述】:

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

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 之前出现错误?

【问题讨论】:

标签: c++ function variables extern


【解决方案1】:

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


3.1 [basic.def]/2 声明是一个定义,除非它声明了一个函数而不指定函数的主体 (8.4),它包含 extern 说明符 (7.1.1) 或链接规范25 (7.5) 并且两者都没有初始化器或函数体 [...]

【讨论】:

  • 我认为定义就像 int varfoo = value;,然后是 int varfoo;是声明。我错了吗?
  • int varfoo;
  • @user1628256:是的。 int varfoo; 是没有初始化的定义,int varfoo = value; 是有初始化的定义。
  • int varfoo = value;
  • @user1628256 int var; var = 5;
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-29
        • 1970-01-01
        • 2015-08-17
        • 1970-01-01
        • 1970-01-01
        • 2019-06-06
        • 1970-01-01
        • 2014-05-25
        相关资源
        最近更新 更多