【问题标题】:extern declaration and function definition both in the same fileextern 声明和函数定义都在同一个文件中
【发布时间】:2012-04-25 14:14:57
【问题描述】:

我只是浏览gcc 源文件。在gcc.c,我发现了类似的东西

extern int main (int, char **);

int
main (int argc, char **argv)
{

现在我怀疑extern 是告诉编译器特定函数不在此文件中,但会在项目的其他地方找到。但在这里,main 的定义紧跟在 extern 声明之后。那么extern 声明的作用是什么?

在这个特定示例中,extern 的行为似乎类似于我们在汇编中使用的 export,而我们在模块外部导出特定符号

有什么想法吗?

【问题讨论】:

    标签: c declaration extern function-declaration


    【解决方案1】:

    您误解了extern - 它确实告诉编译器定义在另一个文件中,它只是声明它存在而不定义它。在 same 文件中定义它是完全可以的。

    C 有声明(声明某事物存在而不定义它)和定义(实际上是使其存在)的概念。您可以声明任意次数,但只能定义一次。

    因为函数默认有外部链接,所以extern关键字在这种情况下是无关紧要的。

    【讨论】:

      【解决方案2】:

      函数在 C 中是隐含的外部函数。包括 extern 只是一个视觉提示。旁注,要使函数不是外部函数,您可以使用 static 关键字。

      【讨论】:

      • 是的。在做一些非标准的事情时使用 extern。
      【解决方案3】:

      在函数声明中,extern 只是声明该函数具有外部链接,这是默认的; extern 关键字在这种情况下完全没用,其效果与没有 extern 关键字的普通声明/原型相同。

      【讨论】:

        【解决方案4】:

        警告可能表明缺少函数原型。就是这样。

        【讨论】:

          【解决方案5】:

          main函数的定义:

          int main(int argc, char **argv) { ... }
          

          已经是一个声明是函数main的原型语法,带有外部链接。这意味着在 main 定义之前使用 extern 的原型声明是多余的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-11-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多