在同一个文件中同时进行外部声明和函数定义

12

我刚刚在浏览 gcc 的源代码文件。在 gcc.c 中,我发现了这样的内容

extern int main (int, char **);

int
main (int argc, char **argv)
{
现在我的疑问是,extern是用来告诉编译器这个特定的函数不在本文件中,但会在项目其他地方找到。但在这里,main的定义紧跟着extern声明。那么extern声明有什么作用呢? 在这个具体的例子中,extern似乎像我们在汇编中使用的export一样运作,可以将特定的符号导出到模块之外。你们有什么想法吗?
5个回答

16
你误解了 extern 的含义 - 它并不是告诉编译器定义在 另一个 文件中,而仅仅是声明它的存在而没有定义它。它可以定义在相同的文件中也是完全没问题的。

C语言有声明和定义的概念。你可以多次 声明 一件事情,但只能定义一次。

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


7

在C语言中,函数默认为extern类型。包含extern关键字只是一种视觉上的提醒。顺便说一下,如果想让一个函数不是extern类型,可以使用static关键字。


使用extern关键字来执行非标准操作。没错。 - user246672
@user246672 这个适用于哪些非标准的事情? - endolith

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

0
警告很可能是提示函数原型缺失,仅此而已。

0

main函数的定义:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接