我研究过&理解在C中创建或编写函数的标准方法是:
function declaration - declare the function name, arguments, and return value
function definition - define the function with the actual code implementation
function call - call or invoke the function with the name and arguments
但是我对使用函数main()
感到困惑。是否允许C在所有代码块中使用main()
,即在声明中使用main()
,在定义中使用main()
并在调用中使用main()
。
请帮助我下个月的考试&我很困惑。
答案 0 :(得分:1)
C中的函数main()
是一个特殊的函数名,它指示程序的起始位置,程序中您编写的C源代码的入口点。 C标准运行时的一部分是需要知道您编写的C程序从哪里开始的入口点。这用函数名main()
表示。
首先,您必须了解C编译器将C源代码文本转换为二进制目标文件。然后将这些二进制对象文件与其他二进制对象文件链接在一起以生成实际的可执行程序。这些类型的二进制目标文件之一是库文件,其中包含以前编译并组合成单个文件的一个或多个函数的二进制代码。
C编译器附带了几个库文件,其中包含完成可执行程序所需的功能。其中之一是编译器的C运行时。
当您的可执行程序启动时,它不会从main()
开始。它改为从C Runtime中的一个特殊位置开始,它为您的可执行文件设置运行时环境,然后调用您提供的main()
函数。 main()
函数是源代码的起始位置。
作为C编译器的一部分,还有一些包含#include <stdio.h>
等文件。这些包含文件包含C标准库函数的声明,例如printf()
函数。
因此,在C编译器中为您声明了main()
函数,但是您必须提供函数的实际定义。
由于main()
是外部标签,因此您只能定义一个名为main()
的函数。如果您有main()
的多个定义,那么当链接器尝试将二进制对象文件链接到一个可执行文件时,它将看到多个main()
函数并发出错误,因为它不知道哪个一个人可以使用。
一种思考方式是:(1)C编译器提供main()
的声明,(2)你提供main()
的定义和(3)C Runtime调用你的函数main()
作为启动计划的一部分。
答案 1 :(得分:0)
在C中你可以递归地调用main。没有定义,你不得申报main。
答案 2 :(得分:0)
C语言标准n1256
5.1.2.2.1程序启动
1程序启动时调用的函数名为main。该 实现声明此函数没有原型。应该是 使用返回类型int定义并且没有参数:
int main(void) { /* ... */ }
或有两个参数(这里称为argc和argv,尽管如此) 可以使用名称,因为它们是它们所在的函数的本地名称 声明):
int main(int argc, char *argv[]) { /* ... */ }
或等效的; 9)或其他一些实现定义的方式。
答案 3 :(得分:0)
在C中,编译器有知道函数的返回类型和参数列表(如果有的话),然后才能转换函数 call 。
函数定义也可用作声明;如果在同一个翻译单元中调用函数之前定义该函数,则不需要为它编写单独的声明:
void foo ( void ) // definition, also serves as declaration
{
...
}
void bar( void )
{
...
foo(); // call
...
}
由于我们在foo
调用之前定义 bar
,因此编译器已经知道foo
的返回类型和参数列表,所以我们在bar
的通话之前不需要另外的声明。但是,如果我们在 foo
之后定义bar
,或者在单独的翻译单元(源文件)中定义了foo
,那么我们在bar
:
void bar( void )
{
void foo( void ); // declaration
...
foo( ); // call
}
void foo( void ) // definition
{
...
}
main
的特殊之处在于,您的代码中通常不需要单独的声明;你通常不会明确地致电main
。它通常由运行时环境调用,它已经期望main
返回int
并采用零或两个参数,如下所示:
int main( void );
int main( int, char ** );
实施可能会为main
提供其他必须记录的签名。
关于我所见过的唯一一个明确呼叫main
的地方是IOCCC;我在生产代码中从未见过有效的用例。