宣布主要原型

时间:2011-02-16 18:11:15

标签: c standards function-prototypes

我有没有理由在C程序中看不到main的原型,即:

int main(int argc, char* argv[]);

int main(int argc, char* argv[])
{
    return 0;
}

似乎总是不一致..

5 个答案:

答案 0 :(得分:10)

C语言标准,草案n1256

5.1.2.2.1程序启动

1程序启动时调用的函数名为main实施声明否 这个功能的原型。它应定义为返回类型int且没有 参数:

int main(void) { /* ... */ }

或者有两个参数(这里称为argcargv,但可能有任何名称 使用,因为它们是声明它们的函数的本地):

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

或等效的; 9)或其他一些实现定义的方式。

强调我的。

答案 1 :(得分:6)

声明原型意味着你想在别处调用它,这对main()函数没有意义。

答案 2 :(得分:2)

不需要原型,因为main不应该被其他程序调用(并且在C ++中调用main实际上是被禁止的。)

答案 3 :(得分:2)

简单的原因是控件总是首先转到main。因此,编译器 会自动定位 ,因此它的原型是多余的,没有用处。

我们在定义之前调用函数时也会使用原型。因此,查看函数原型编译器可以判断调用是否合法。但是在main的情况下我们 习惯于提供其定义及其声明 (这在逻辑上也是正确的)因此不需要原型。

即使我们将c程序组织成多个文件,也不需要主的原型。

答案 4 :(得分:0)

原型的最初目的是支持对可以由单遍编译器处理的函数的正向引用。

换句话说,如果您有这样的事情:

void function_A(){
    printf( "%d", function_B( 5 ) );
}

int function_B( int x ){
    return x * 2;
}

function_B在定义之前被调用。这将为简单的编译器带来问题。为了避免这些问题,请将原型放在文件的开头,以确保编译器提前知道文件中的所有功能,因此正向引用对于类型检查不是问题。

由于main函数的所有有效形式都是编译器事先知道的,因此没有必要创建原型,因为编译器可以在没有main。()的情况下类型化对main()的正向引用。