该标准明确规定main
有两个有效(即保证有效)的签名;即:
int main();
int main(int, char*[]);
我的问题很简单,以下是合法的吗?
int main(const unsigned int, const char* const* argv);
我的测试说“是”,但我不确定答案,因为我没有因为main
更改为int
以及非顶级{{}}而超载unsigned int
{1}} - argv的问题?如果我是,那么这显然是被禁止的。
那么,这些修改是否可以在符合标准的编译器上运行?
答案 0 :(得分:33)
C ++ 98标准在3.6.1节第2节中说明
实现不应预定义主函数。此功能不应过载。它应具有类型
int
的返回类型,否则其类型是实现定义的。所有实现都应允许以下main
的定义:int main()
和int main(int argc, char* argv[])
因此接受main
的环境可以接受但是允许的标准没有强制要求。
因为这是经常提到的,所以上一段是豁免独立环境,除了记录他们的行为之外的任何事情:
程序应包含一个名为main的全局函数,它是程序的指定开始。它是 实施定义 是否需要在独立环境中的程序来定义主体 功能。 [注意:在独立环境中,启动 终止是实现定义; 启动 包含具有静态存储持续时间的命名空间作用域对象的构造函数的执行;终止 包含具有静态存储持续时间的对象的析构函数的执行。 ]
答案 1 :(得分:19)
您必须使用符合标准的签名之一才能符合标准。
我完全理解你为什么要这样做。最好的方法是编写自己的函数 myMain()或任何你想要的签名,并从main()调用它,包括所需的强制转换。
答案 2 :(得分:2)
argv
指针不应该是const char* const
,因为允许程序更改缓冲区。
答案 3 :(得分:1)
据我所知,从阅读标准来看,你是不符合标准的。但我无法想象一个不会让你这样做的编译器。同样,编译器需要做更多的工作来专门禁止一个大多数无害且非常模糊的边缘情况。
答案 4 :(得分:1)
如果编译器对main
使用名称重整,则这可能不起作用。毕竟它是一个C ++函数。因此,链接器将寻找两个特定的“mangling”。你的定义会有另一个错位。
请注意main
是特殊的(不会过载,不可调用),可能根本不需要名称修改。
答案 5 :(得分:0)
您可能违反标准,但大多数运行时并不关心。他们只需按argc
的整数和argv
的指针,调用main
,并希望您正确解析它们。因此,在您的权限范围内,“保证工作”是值得商榷的,因为加载器实际上并不关心您所声明的参数。
如果构建,main
将被调用。你如何解析参数取决于你。我应该澄清这是高度特定于平台的,几乎整个问题都是如此。
那说,为什么?
答案 6 :(得分:0)
ISO / IEC 9899:TC3
第5.1.2.2.1节程序启动
程序启动时调用的函数名为main。实施宣布否 这个功能的原型。它应该使用返回类型int和no来定义 参数:
int main(void) { /* ... */ }
或有两个参数(这里称为argc和argv,但可能有任何名称 使用,因为它们是声明它们的函数的本地函数):
int main(int argc, char *argv[]) { /* ... */ }
或等效的; 9)或其他一些实现定义的方式。