C ++中main的签名参数是否具有unsiged和const限定符?
该标准明确指出, main
有两个有效的(即保证工作)签名; 即:
int main(); int main(int, char*[]);
我的问题很简单,像下面这样是合法的吗?
int main(const unsigned int, const char* const* argv);
我的testing说'是',但我不确定的答案,因为我没有重载main
通过更改int
为unsigned int
以及非顶级const
的argv? 如果我是,那么这显然是禁止的。
那么,这些修改是否能够保证符合标准的编译器?
C ++ 98标准在第3.6.1节第2段中说过
一个实现不应该预定义主函数。 该function不得超载。 它应该有一个types为
int
的返回types,否则它的types是实现定义的。 所有的实现都应该允许main
的下列定义:int main()
和int main(int argc, char* argv[])
所以这个标准没有规定env接受main
是可以接受的,但是这是允许的。
因为这是经常提到的,这里是前面的一段话,它可以免除任何事情的独立环境,但是logging下它们的行为:
程序应该包含一个名为main的全局函数,它是程序的指定开始。 它是实现定义是否需要在独立环境中的程序来定义主要function。 [注意:在独立环境中,启动和终止是实现定义的; 启动包含具有静态存储持续时间的命名空间范围对象的构造函数的执行; 终止包含具有静态存储持续时间的对象的析构函数的执行。 ]
您必须使用符合标准的签名之一才能符合标准。
我完全理解你为什么要这样做。 最好的方法是编写自己的函数myMain()或任何你想要的签名,并从main()调用它,包括所需的强制转换。
argv
指针不应该是const char* const
因为程序被允许改变缓冲区。
据我所知,阅读标准,你是不符合标准的。 但我无法想象一个不会让你这样做的编译器。 就像在编译器中,需要更多的工作来专门禁止一个几乎无害且非常模糊的边缘案例。
如果编译器对main
使用名称修饰,这可能不起作用。 毕竟这是一个C ++函数。 因此,链接器将寻找两个特定的“manglings”。 你的定义会有另一个错位的名字。
请注意, main
是特殊的(不会重载,不可调用),并且可能不需要名称修改。
标准可能会违法,但大多数运行时间并不关心。 他们只需要为argc
和argv
一个整数,然后调用你的main
,并且希望你正确地parsing它们。 所以,在你的范围内,“保证工作”是值得商榷的,因为装载机并不关心你声明的论点。
如果它build立, main
将被调用。 你如何parsing这些论点取决于你。 我应该澄清,这是非常特定于平台的问题,几乎就是这个问题。
这就是说, 为什么?
ISO / IEC 9899:TC3
第5.1.2.2.1节程序启动
程序启动时调用的函数名为main。 这个实现声明了这个函数没有原型。 它应该用int的返回types来定义,并且不带参数:
int main(void) { /* ... */ }
或者带有两个参数(这里称为argc和argv,尽pipe可以使用任何名称,因为它们是声明它们的函数的本地):
int main(int argc, char *argv[]) { /* ... */ }
或等同物; 9)或以某种其他实施方式定义的方式。