C++ 如何在C++;?

C++ 如何在C++;?,c++,pointers,C++,Pointers,我正在尝试编写一个函数来解析命令行参数。这是函数声明: void parse(int, char const **); 为了以防万一,我还尝试了使用typedef const char cchar、const char**和cchar**。但是,如果我将char**传递到函数中,所有这些(正如预期的那样,因为它们都应该相同)都会导致错误,如: void main(int argc, char **argv) { parse(argc, argv); 我从GNU的编译器得到的错误是:从

我正在尝试编写一个函数来解析命令行参数。这是函数声明:

void parse(int, char const **);
为了以防万一,我还尝试了使用
typedef const char cchar
const char**
cchar**
。但是,如果我将
char**
传递到函数中,所有这些(正如预期的那样,因为它们都应该相同)都会导致错误,如:

void main(int argc, char **argv) {
    parse(argc, argv);
我从GNU的编译器得到的错误是:从'char**'到'const char**'的转换无效。而从Clang得到的错误是,
候选函数不可行:没有已知的第二个参数从'char**'到'const char**'的转换。


我看到过这样的解决方案,建议将指针声明为指向char的const指针(
const char*const*
),但我不希望任何一个指针都是const,因为我希望能够修改指针,以便可以使用(;**argv;++*argv)对参数进行迭代。如何声明“指向常量字符的非常量指针”

函数应声明为:

void parse(int, char const * const *);
在C++中, char **/COD>可以在所有指针深度中隐式添加<代码> const ,因此可以称之为“代码>解析(ARCC,ARGV)< /代码> .<
在C语言中,
const
只能在第一个指针深度处添加(这是语言中的一个设计缺陷)。因此,必须将函数调用为:
parse(argc,(char-const*const*)argv)
不幸的是。

在允许任何其他
const
组合调用函数的同时,防止修改参数的最安全签名是:

parse(int argc, char const* const* argv);
这意味着
argv
是指向
const
的指针,指向
const char

您可以愉快地迭代如下参数:

for(auto arg = argv + 1; *arg; ++arg)
{
    if(!std::strcmp(*arg, "--help"))
        return print_help();
    else if(!std::strcmp(*arg, "-v") || !std::strcmp(*arg, "--verbose"))
        verbose_flag = true;
    // ... etc...
}
注意,不需要接受变量
int argc
,因为字符数组的数组以null结尾

所以我通常用这个:

struct config
{
    // program options and switches
};

config parse_commandline(char const* const* argv);

C与C++不一样;你需要选择一种语言。您可以尝试类似于char*const*;但是
main
希望声明
intmain(intargc,char**argv)
在您的情况下,只有数据是
const
。指针仍然是可变的。您可以使用
parse(argc,const_cast(argv))将其强制转换为
const
MalCube()/代码>的结果转换成C,但是这不会在C++中编译。^,同样的代码可以在C中正确,C++中是正确的,但是在每个方面都做了不同的事情。(我想到的一个例子是条件运算符的结合性)argv保证以NULL结尾吗?我不知道那个事实。在这种情况下,为什么甚至需要argc作为参数?@deadbellet是的,这在标准中。