extern声明和函数定义都在同一个文件中

时间:2012-04-13 07:46:37

标签: c declaration extern function-declaration

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

的内容
extern int main (int, char **);

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

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

在这个具体示例中,似乎extern似乎表现得像我们在汇编中使用的export,我们在模块外部导出特定符号

有什么想法吗?

5 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

main函数的定义:

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

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