Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ main()std::string而不是char**_C++ - Fatal编程技术网

C++ main()std::string而不是char**

C++ main()std::string而不是char**,c++,C++,编译器发出警告 警告:“int main(int,std::string*)”的第二个参数应该是“char**”[-Wmain] 当我选择投入 intmain(intargv,std::stringa[]) 而不是 intmain(intargv,char*argc[]) 如果你能想出一个理由,也可以祈祷多特尔弦方法有什么问题 我指的是STD::字符串是字符表示/字符串表示的后缀,对于C++,为什么要使用C样式?< /P> 同时 标准实现真的没有漏洞吗?原因很简单:语言规则并不强制您使用表单,

编译器发出警告
警告:“int main(int,std::string*)”的第二个参数应该是“char**”[-Wmain]

当我选择投入

intmain(intargv,std::stringa[])

而不是

intmain(intargv,char*argc[])

如果你能想出一个理由,也可以祈祷多特尔弦方法有什么问题

我指的是STD::字符串是字符表示/字符串表示的后缀,对于C++,为什么要使用C样式?< /P> 同时


标准实现真的没有漏洞吗?

原因很简单:语言规则并不强制您使用表单,您使用的实现也不支持自己选择的表单

引用标准3.6.1p2

实现不应预定义主要功能。此功能不应过载。它应具有int类型的返回类型,但其类型由实现定义。所有实施均应允许以下两种定义:

在后一种形式中,argc应为从运行程序的环境传递给程序的参数数。如果argc为非零,则应在argv[0]到argv[argc-1]中提供这些参数,作为指向以null结尾的多字节字符串(NTMBS)(17.3.2.1.3.2)的初始字符的指针,并且argv[0]应是指向NTMBS的初始字符的指针,该NTMBS表示用于调用程序或“”的名称。argc的值应为非负。argv[argc]的值应为0。[注:建议在argv之后添加任何其他(可选)参数。]

编辑:涵盖其他问题:

没有必要“破解”任何东西,因为没有任何东西可以停止使用一个函数或类,该函数或类接受原始的argc和argv并将其逐字处理为向量,或者更好地解析它并将处理后的数据映射到内部变量。我们有很多这样的工具,那些每年创建超过几个main()-s的工具可能已经使用了其中一个或自己的工具

解决方法:

 vector<string> args(argv, argv + argc);

 for (auto s: args) 
      cout << s << endl;

您已经得到了实现不需要支持它的原因。但是,您的实现不想支持它还有一个原因:


调用
main
的代码(通常是预编译的)传递一个
int
和一个
char**
(在一些实现中,作为第二个
char**
扩展;实际上,在许多平台上,它精确地获取操作系统已经提供的数据,并将其传递下去)。忽略尾随参数很容易(通常它们以相反的顺序推送到堆栈中,因此忽略附加参数只意味着不访问它们,不需要附加逻辑)。但是,不能将
char**
作为
std::string*
读取,因此编译器必须生成额外的代码来支持此接口。考虑到使用该接口的任何源代码无论如何都是不可移植的,很少有人会使用它,并且考虑到原始接口工作正常,实现该替代接口将是一种资源浪费。

因为
main()
不允许在符合标准的代码中包含
std::string
参数。请参阅。剧透警报:“argv”和“argc”这两个名称实际上意味着什么,它们通常按特定顺序使用是有原因的。“编译器发出警告是有原因的吗”-嗯,你怎么看?编译器发出警告只是为了好玩,没有任何理由,只是为了惹恼你?(这是你应得的,但仍然…)@H2CO3我认为编译器虽然是一段很棒的代码,但仍然是一段不学习的代码..无法想象它能处理非常可能的输入..所以我只是认为它可能只是捏造出来的。@nerorevenge:你不需要“学习”编译器来处理不正确的代码。它只是遵循语言的规则(但要查找)内部编译器错误,这是由于编译器本身中的错误而导致的一类罕见的错误。是的,STD::String是C++类型,操作系统更难实现。请记住,操作系统正在通过
main
函数向您的函数传递信息。指向nul终止字符串的指针数组对于操作系统来说很容易实现和传递。这也让操作系统使用一个函数调用你的函数,无论它是用C++还是C实现的;请记住,C没有std::string。强制形式是从C继承的。对于扩展主要功能,没有任何建议。我想,由于缺乏良好的动机,我们的方法可以正常工作,实际上大多数用户都有库和框架来处理命令行。
std::string
是一个动态字符串。它不是每种字符串类型情况的灵丹妙药。命令行参数对于非动态字符串来说是一个完美的例子,
std::string
显然是过火了。我认为现在没有多少实现是操作系统直接调用
main
,而不是编译器提供的中间代码。当然,如果OS提供的参数首先被复制到<>代码> STD::String ,然后把它们交给<代码>主< /代码>。它可能不是语言核心的一部分,当然,但它是在C++语言标准中。此外,C++不需要(向后)不兼容。如果没有讨厌的<代码>滥用名称空间STD,我将加1。代码>。教新手糟糕的做法更糟糕!他们没有精神力量看穿你建议中不好的部分:(@LeonidVolnitsky)这不是借口,事实上KerrekSB是对的,encoura
int main(int argc, char* argv[]) { /* ... */ }
 vector<string> args(argv, argv + argc);

 for (auto s: args) 
      cout << s << endl;
 auto args = ro::range(argv,argv+argc);

 for (auto s: args) 
      cout << s << endl;