为什么main函数没有声明为extern?

4
当我们想要在主函数Main.c中使用另一个文件File1.c中的函数,比如void foo(void),为什么我们不需要在File1.c中写:
extern int main(void);
假设File1.cMain.c在同一个翻译单元中。

2
假设File1.c和Main.c在单个TU中 - 这是什么意思?TU是源文件,在处理#include指令后生成。只有当它们中的一个包含另一个或者它们都被包含在某个其他文件中时,File1.c和Main.c才能在同一个TU中。 - Steve Jessop
@Steve Jessop - 我觉得你有点混淆了...我们可以在TU中编译两个源文件,而不一定要包含它们...我们只需要将它们传递给编译器即可...我刚刚试过了以确保...如果有任何要求,你只需要包含头文件,我们不需要包含源文件 - 否则在编译时它们将进入文件作用域!! - Expert Novice
2
C99标准,5.1.1.1/1:“一个源文件连同所有通过预处理指令#include包含的头文件和源文件被称为预处理翻译单元。经过预处理后,预处理翻译单元被称为翻译单元”。我认为你指的不是TU(可能是可执行文件或静态库),但是TU不是正确的术语。 - Steve Jessop
@Lohit:如果它们在同一个TU中,那么它们中的一个已经#include了另一个,这有点奇怪。 - Oliver Charlesworth
1
我想我明白了...我搞错了extern的作用,它是用于不同翻译单元之间的链接,而不是文件之间的链接。 - Expert Novice
3个回答

7
你从不需要在函数声明中加上extern。函数默认具有外部链接。在一些较旧的代码中观察到了一种奇怪且无法解释的习惯:将extern添加到所有外部函数声明中(这可能是你关于main的问题所在)。实际上,这完全没有必要,毫无意义,只会使代码混乱无用。
如果你愿意,你当然可以使用extern来声明main。但这完全多余。

5
首先,函数默认为extern
此外,main函数是“特殊的”,链接器会以不同的方式处理它。

2
因为整个可执行文件中只需要有一个main作为执行的起点,所以每个翻译单元都不需要与main具有链接关系。引用自C++标准(我认为对于C也是同样的情况)-ISO/IEC 14882:2003(E) 3.6.1:“3 [...] main的链接(3.5)是实现定义的。[...]”

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