5.1.2.2.1 Program startup
The implementation declares no prototype for this function. It shall be defined
with a return type of int and with no parameters.
我已经定义了这样,
int main(int a, int b, int c){.......}
有效。我没理解第一行"The implementation declares no prototype for this function"
需要帮助,谢谢
答案 0 :(得分:2)
当你制作一个原型时,这意味着你想在别处调用它而不是main
函数的情况。
来自docs: -
5.1.2.2.1程序启动
1程序启动时调用的函数名为main。该 实现声明此函数没有原型。应该是 使用返回类型int定义并且没有参数:
int main(void){/ * ... * /}
或有两个参数(这里称为argc和argv,尽管如此) 可以使用名称,因为它们是它们所在的函数的本地名称 声明):
int main(int argc,char
*argv[]
){/ * ... * /}或等效的; 9)或其他一些实现定义的方式。
答案 1 :(得分:2)
这意味着main
未提前宣布。没有像
int main(int argc, char*argv[]);
这意味着当你定义函数时,你可以假装它接受任何参数并返回你喜欢的任何类型,而不会出现编译器错误。
当然,main
由操作系统调用,因此它希望您的定义与它用于传递参数的任何约定相匹配。实际上,除了在嵌入式系统上,你对main的定义必须与上面的匹配。
答案 2 :(得分:1)
declaration or prototype
不需要main
功能
除main
以外的其他功能需要声明和
定义强>
int sum(int,int); //declaration
int sum(int a,int b) //definition
{
//body
}
答案 3 :(得分:1)
你遗漏了该部分标准的其余部分,我将引用C99标准草案,其中说:
或有两个参数(这里称为argc和argv,但可能有任何名称 使用,因为它们是声明它们的函数的本地函数):
int main(int argc, char *argv[]) { /* ... */ }
或等效的; 9)或其他一些实现定义的方式。
shall be defined
是引用是重要的部分,它表示它必须遵循这两个签名之一,或者如果可用的话,某些特定于实现的签名将由编译器实现者定义。
如果我尝试在最新版本的clang
中构建它,我会看到以下错误:
error: second parameter of 'main' (argument array) must be of type 'char **'
int main(int a, int b, int c){}
error: third parameter of 'main' (environment) must be of type 'char **'