【发布时间】:2017-05-29 00:51:21
【问题描述】:
我正在尝试编写一个函数来解析命令行参数。这是函数声明:
void parse(int, char const **);
以防万一,我还尝试了(const char)**、const char ** 和cchar ** 使用typedef 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。
我已经看到建议的解决方案是声明一个指向 char 的 const 指针 (const char * const *) 的指针,但我不希望任何一个指针都是 const,因为我希望能够修改指针以便可以迭代在使用for(; **argv; ++*argv) 的参数上。如何声明“指向 const char 的非 const 指针的非 const 指针”?
【问题讨论】:
-
C 和 C++ 不一样;你需要选择一种语言。你可以试试
char*const*;但是main想要声明为int main(int argc, char**argv); -
在您的情况下,只有数据是
const。指针仍然是可变的。您可以使用parse(argc, const_cast<char const **>(argv));将其转换为const。 -
“我的印象是所有干净(没有警告)的 C 代码都是有效的 C++ 代码。”——嗯,不。例如,不需要在 C 中强制转换
malloc()的结果,但这不会在 C++ 中编译。 -
^ 同样,相同的代码在 C 中可以是正确的,在 C++ 中也可以是正确的,但在每个代码中做不同的事情。 (条件运算符的结合性是我想到的一个例子)