这个警告信息的意思是:参数与原型不匹配;
一个小例子来说明这种情况;
foo(const char **p);
int main(int argc,char **argv)
{
foo(argv);
return 0;
}
编译这个的时候就会出现这条警告信息,问题出现在调用foo(const char **p)函数过程中,参数的传递上。
标准C中,并不认同有限制符的形参const char **p和没有限制符的实参char **p是相容的;
首先,ANSI C标准中有过这么一段话:每个实参都应该有自己的类型,这样就可以将它的值赋值给与它所对应的形参类型的对象。就是说类型完全相同的参数之间可以赋值;所以,上面会出现一条编译警告;
说明:const char** 类型是一个没有限定符的类型,它的类型是:指向一个具有const限定符的char类型的指针的指针,所以,char**和const char**都是没有限定符的指针类型,但是他们指向的类型不一样,一个指向char *,另一个指向const char*,因此他们不相容;
另外,ANSI C中还说明了一种特殊情况:两个操作数都是指向有限定符或者无限定符的相容类型的 指针,或者左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。所以,这里在函数中调用实参char*可以和形参const char*匹配,例如:
char* p;
const char* p1;
p1=p;
左边操作数是一个指向const限定符的char 指针;而右边操作数是一个没有限定符的char指针;而char类型与char类型是相容的,左操作数所指向的类型具有右操作数所指向的类型的限定符(无),再加上自身的限定符(const).所以这种赋值就是合法的,不会有任何编译问题;
而如果反过来,p=p1,编译的时候就会出现我们上边的警告信息;