所以我有一个库函数,它将const char**作为其参数之一,以表示char*s的数组。
void libraryFunc(const char ** parameter);
所以我目前正在做的是(全部用C btw):
char *string1 = "myString";
char *string2 = "myString2";
char *stringArray[2] = { string1, string2 };
libraryFunc(&stringArray[0]);
^这会导致编译器错误,显示"没有对libraryFunc的匹配调用"。我也尝试过以下方法:
libraryFunc(stringArray);
libraryFunc(&stringArray);
似乎想不通。
您可以投射它:
libraryFunc( (const char **) stringArray);
或者,最好只是更改数组的声明:
char *string1 = "myString";
char *string2 = "myString2";
const char *stringArray[2] = { string1, string2 };
libraryFunc(stringArray);
您不能将char **
隐式转换为const char **
,因为它只在第一级间接层工作(请注意,在上面的第二个摘录中,您将把char *
隐式转换成const char *
,因为它在第一级直接层,所以这很好)。这个来自comp.lang.cFAQ的问题更详细地解释了为什么它会以这种方式工作。
这是因为您试图通过
char* - a pointer
至
const char** - pointer to pointer to const char
const的使用是一个约定,不能通过间接使用两个指针来满足这个约定。之所以如此,是因为否则你总是可以像这样更改这个常量字符应用程序(这是从C++标准中获得的,我有意见):
const char c = 'c';
char* pc;
const char** pcc = &pc; // not allowed (thankfully!)
^^^ here the bundit is hidden under const: "I will not modify"
*pcc = &c; // *pcc is "pointer to const" right? so this is allowed...
*pc = 'C'; // would allow to modify a const object, *pc is char right?
有关更多详细信息,您可以关注我对类似主题的另一个回答:https://stackoverflow.com/a/16390371/1141471
在线代码:
http://coliru.stacked-crooked.com/a/74392c59cfc3ef70