C 为什么main不声明为extern

C 为什么main不声明为extern,c,C,当我们想在myMain.c[我的主要函数在哪里]中的File1.c中使用函数时,比如说void foo(void),为什么我不需要写: extern-int-main(无效) 在File1.c中 假设File1.c和Main.c在一个TU中 因为在作为执行起点的可执行文件的整个部分中只需要一个main。每个翻译单元不需要链接到main 引用C++标准(我假设C也是一样)- ISO/IEC 14882:2003(E)3.6.1 3[…]主要连接件(3.5)为 实现定义。[……] 首先,默认情况下,

当我们想在my
Main.c
[我的主要函数在哪里]中的
File1.c
中使用函数时,比如说
void foo(void)
,为什么我不需要写:

extern-int-main(无效)

File1.c

假设
File1.c
Main.c
在一个TU中


因为在作为执行起点的可执行文件的整个部分中只需要一个
main
。每个翻译单元不需要链接到
main

引用C++标准(我假设C也是一样)-

ISO/IEC 14882:2003(E)3.6.1

3[…]主要连接件(3.5)为 实现定义。[……]


首先,默认情况下,函数是
extern


此外,
main
是“特殊的”;链接器的处理方式不同。

您永远不需要使用函数声明编写
extern
。默认情况下,函数具有外部链接。在一些旧代码中观察到一个奇怪的无法解释的习惯:向所有外部函数声明添加
extern
。(这可能是您提出有关
main
的问题的原因)实际上,它完全没有必要,没有任何用途,只会使代码变得混乱


如果愿意,您当然可以使用
extern
声明
main
。但是它是完全冗余的。

“假设File1.c和Main.c在一个TU中”-这意味着什么?TU是处理
#include
后的源文件。
File1.c
Main.c
可以在一个TU中的唯一方法是,如果其中一个
#include
是另一个,或者它们都是其他文件中的
#include
d。@Steve Jessop-我想你这里有点混淆了。。。我们可以在TU中编译2个源文件,而不必包含它。。。我们只需要把它们传递给编译器…我只是想确认一下。。。。如果有任何要求,您只需要包含标题,我们
包含源文件-否则在编译时它们将进入文件范围!!C99标准,5.1.1.1/1:“源文件以及通过预处理指令#include包含的所有标题和源文件称为预处理翻译单元。预处理后,预处理翻译单元称为翻译单元”。我想你指的不是TU(可能是可执行文件或静态库),但TU不是正确的词。@Lohit:如果它们在同一个TU中,那么其中一个包含了另一个,这有点奇怪。我想我明白了。。。我把
extern
的东西搞砸了,那是在单独的tu中进行链接,而不是在文件中。。