有效的C ++ main
签名如下:
int main()
int main(int argc, char *argv[])
int main(int argc, char **argv)
但是不允许声明main
获取初始化列表:
int main(std::initializer_list<char *> args)
AFAIK初始化列表可以实现为一对指针或指针(可以是argv
参数)加上一个长度(这可以从argc
参数推导出来),以及存储可以是自动,临时或静态只读存储器depending on the situation。
所以我认为std::initializer_list<char *>
可以处理和管理命令行参数没有任何问题,然后我想知道为什么在初始化程序列表批准后没有添加这个假设的main
签名在C ++ 11标准上,因为我要求:
main
参数的缺点或问题是什么? (我想不到任何事情)。答案 0 :(得分:4)
虽然在程序中有两种指定main()
的方法,但C ++运行时的大多数(全部?)当前实现都以相同的方式调用main()
函数(它们将参数传递为{ {1}}无论(int, char *[])
如何宣布)。您的提案需要所有实现的C ++运行时才能确定程序正在使用哪种main()
,并调用正确的main()
。如果你真的想要自己使用这个功能,你总是可以提供main()
的实现,它将参数转换为像对象一样的初始化列表(例如main(int, char *[])
),然后调用一个新的入口点函数你的选择。
Standard C++ website描述了提交提案的流程。基本步骤是:(1)将想法浮现在Usenet组/邮件列表中; (2)起草提案,征求反馈意见并相应更新提案; (3)重复该过程,直到该提案被接受为止。
答案 1 :(得分:4)
值得注意的是一个库(但不是标准的C ++库,根据3.6.1 [basic.start.main]第2段,第一句:“实现不应预定义main
函数。” )可以定义函数main()
并以合适的方式实现它,例如,调用app_main()
:
#include <initializer_list>
#include <string>
#include <vector>
extern int app_main(std::vector<std::string> const&);
int main(int ac, char* av[]) {
return app_main(std::vector<std::string>(av, av + ac));
}
由于main()
无法重载(根据3.6.1 [basic.start.main]第2段,第二句:“此函数不应重载。”)入口点需要不同的名称。由于std::initializer_list<T>
除了使用{ ... }
之外无法构建,因此需要使用与std::initializer_list<T>
不同的类型。在此过程中,上述实现还选择将char*
转换为std::string
个对象。
要使用上述功能,应用程序只会实现app_main()
,它将被调用:
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
int app_main(std::vector<std::string> const& args) {
std::cout << "received the arguments: ";
std::copy(args.begin(), args.end(),
std::ostream_iterator<std::string>(std::cout, " "));
return EXIT_SUCCESS; // return statement can't be omitted, of course
}
答案 2 :(得分:0)
我认为这是由于C兼容性的考虑而不是技术原因。从C继承了很多东西。