如何在C++中声明指向常量的指针?

Dea*_*tle 3 c++ pointers

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

void parse(int, char const **);
Run Code Online (Sandbox Code Playgroud)

为以防万一,我也尝试过(const char)**,const char **cchar **使用typedef const char cchar.但是,如果我将一个char **函数传递给函数,所有这些(如预期的那样,因为它们应该都是相同的)会导致错误,如:

void main(int argc, char **argv) {
    parse(argc, argv);
Run Code Online (Sandbox Code Playgroud)

我从GNU编译器获得的错误是error: invalid conversion from 'char**' to 'const char**'来自Clang的错误candidate function not viable: no known conversion from 'char **' to 'const char **' for 2nd argument.

我已经看到这样的解决方案被建议为声明一个指向char(const char * const *)的const指针的指针,但我不希望任何指针都是const因为我希望能够修改指针,所以我可以迭代一个参数使用for(; **argv; ++*argv).如何声明"指向const char的非const指针的非const指针"?

M.M*_*M.M 7

该函数应声明为:

void parse(int, char const * const *);
Run Code Online (Sandbox Code Playgroud)

在C++中,char **可以隐式添加const所有指针深度,因此可以将其称为parse(argc, argv).

在C中,const只能在第一个指针深度处添加(这是语言中的设计缺陷).这是一个专门的线程.所以你必须把这个函数称为: parse(argc, (char const * const *)argv);不幸的是.


Gal*_*lik 5

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

parse(int argc, char const* const* argv);
Run Code Online (Sandbox Code Playgroud)

这意味着,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...
}
Run Code Online (Sandbox Code Playgroud)

请注意,不需要接受变量,int argc因为字符数组数组为空终止.

所以我通常使用这个:

struct config
{
    // program options and switches
};

config parse_commandline(char const* const* argv);
Run Code Online (Sandbox Code Playgroud)