C 为什么main不声明为extern
当我们想在myC 为什么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)为 实现定义。[……] 首先,默认情况下,
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中进行链接,而不是在文件中。。