C的main()函数的有效签名是什么?

时间:2010-01-21 09:46:52

标签: c language-lawyer signature entry-point function-prototypes

C中主要功能的有效签名究竟是什么?我知道:

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

还有其他有效的吗?

5 个答案:

答案 0 :(得分:63)

本回答时的当前标准(C11)明确提到了这两个:

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

虽然它确实提到了“或等同”这个短语,但附有以下脚注:

  

因此,int可以替换为定义为typedef的{​​{1}}名称,或者int的类型可以写为argv,因此上。

此外,它还提供了更多(实现定义的)可能性。

相关部分(C11中的第5.1.2.2.1节,但此特定方面与C99相同)说明:

  

程序启动时调用的函数名为main。该实现声明此函数没有原型。它应该用返回类型int定义,没有参数:

char ** argv
     

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

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

或同等的;或者以其他一些实现定义的方式。

     

如果声明它们,主函数的参数应遵守以下约束:

     
      
  • int main(int argc, char *argv[]) { /* ... */ } 的值应为非负值。

  •   
  • argc应为空指针。

  •   
  • 如果argc的值大于零,则数组成员argv[argc]通过   argv[0]包含应包含指向字符串的指针   程序启动前主机环境实现定义的值。该   意图是在程序启动之前为程序提供信息   来自托管环境中的其他地方。如果主机环境不具备   为字符串提供大写和小写的字母,实现   应确保以小写字母收到字符串。

  •   
  • 如果argv[argc-1]的值大于零,则argc指向的字符串   代表程序名称; argv[0]如果是,则为空字符   程序名称不能从主机环境中获得。如果argv[0][0]的值是   大于一,argc通过argv[1]指向的字符串   代表程序参数。

  •   
  • 参数argv[argc-1]argc以及argv数组指向的字符串应   可以由程序修改,并在程序之间保留它们最后存储的值   启动和程序终止。

  •   

请注意,这适用于托管环境,您通常在C程序中看到的环境。独立环境(例如嵌入式系统)的约束要少得多,如同标准的5.1.2.1中所述:

  

在独立环境中(C程序执行可能在没有任何情况下执行)   操作系统的好处),程序调用的函数的名称和类型   startup是实现定义的。任何独立的图书馆设施   程序,除了第4条要求的最小集合外,都是实现定义的。

答案 1 :(得分:13)

答案 2 :(得分:8)

POSIX支持execve(),后者又支持

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

添加的参数是环境,即NAME = VALUE形式的字符串数组。

答案 3 :(得分:8)

http://en.wikipedia.org/wiki/Main_function_(programming)#C_and_C.2B.2B

除了通常的int main(int argc, char *argv[])和POSIX int main(int argc, char **argv, char **envp)之外,在Mac OS X上也支持

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

当然只有Mac版。

在Windows上有

int wmain(int argc, wchar_t* argv[], wchar_t* envp[]);

作为Unicode(实际上是宽字符)变体。当然还有WinMain

答案 4 :(得分:2)

int main(void)

在某些操作系统(例如,Windows)下,这也是有效的:

int main(int argc, char **argv, char **envp)

其中envp提供了一个环境,否则可以通过getenv()

访问