如何在C 中声明指向Constance指针的指针

How to declare a pointer to pointer to constant in C++?

本文关键字:指针 Constance 声明      更新时间:2023-10-16

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

void parse(int, char const **);

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

void main(int argc, char **argv) {
    parse(argc, argv);

我从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

我已经看到了建议的解决方案是宣布指向const指向char的指针(const char * const *(,但是我不希望任何一个指针成为const,因为我希望能够修改指针,以便我可以通过一个使用for(; **argv; ++*argv)的参数。我如何声明"非符合指针指向const char的非const指针"?

该功能应声明为:

void parse(int, char const * const *);

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

在C中,const只能在第一个指针深度添加(这是语言中的设计缺陷(。这是一个专用线程。因此,您必须将该函数称为:parse(argc, (char const * const *)argv);不幸。

允许任何其他const组合调用该函数的最安全的签名是:

parse(int argc, char const* const* argv);

这意味着 argv指针 const 指针 to 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...
}

注意,由于字符数组的数组为 null终止

,因此无需接受变量int argc

所以我通常会使用以下方式:

struct config
{
    // program options and switches
};
config parse_commandline(char const* const* argv);