我正在尝试编写一个函数来解析命令行参数.这是函数声明:
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指针"?
该函数应声明为:
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);不幸的是.
防止修改参数同时允许任何其他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)
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |