如何在C 中声明指向Constance指针的指针
How to declare a pointer to pointer to constant in C++?
我正在尝试为解析命令行参数编写一个函数。这是函数声明:
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);
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 如何在C 中声明指向Constance指针的指针