11

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

extern int main (int, char **);

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

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

在这个特定的例子中, extern看起来就像export我们在汇编中使用的那样,我们在模块之外导出一个特定的符号

有任何想法吗?

4

5 回答 5

14

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

C 有声明(声明某事物存在而不定义它)和定义(实际上是使其存在)的概念。您可以根据需要多次声明某些内容,但只能定义一次。

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

于 2012-04-13T07:49:14.673 回答
6

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

于 2012-04-13T07:48:50.837 回答
2

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

于 2012-04-13T07:49:27.033 回答
0

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

于 2012-04-13T07:48:37.553 回答
0

函数定义main

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

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

于 2012-04-13T07:49:01.643 回答