C编译时候的一个小小的警告:warning:argument is incompatible with prototype
2013-10-25 09:40
701 查看
这个警告信息的意思是:参数与原型不匹配;
一个小例子来说明这种情况;
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,编译的时候就会出现我们上边的警告信息;
一个小例子来说明这种情况;
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,编译的时候就会出现我们上边的警告信息;
相关文章推荐
- 解决Warning:android-apt plugin is incompatible with future version of Android Gradle plugin.
- 编译错误This version of Android Studio is incompatible with the Gradle Plugin used
- KeilMDK编译警告:warning: #514-D: pointless comparison of unsigned integer with a negative constant
- 怎么统计android编译时候的warning警告的个数及种类
- 错误argument of type "char *" is incompatible with parameter of type "LPCWSTR"的解决方法
- 导入一个例子,报XXX.jar is cross-compiled with an incompatible version of Scala (2.10).
- 发布Layouts页面的时候报错:System.ArgumentException: Invalid SPListItem. The SPListItem provided is not compatible with a Publishing Page
- Linux 3.9.10内核编译错误:multiple (or no) load addresses: This is incompatible with uImages的解决
- C编译问题: declaration is incompatible with previous "FuncName" (declared at line XXX)
- Warning:android-apt plugin is incompatible with future version of Android Gradle plugin
- 错误argument of type "char *" is incompatible with parameter of type "LPCWSTR"的解决方法
- postfix-3.1.1编译安装成功, 启动的时候警报:postfix: warning: smtputf8_enable is true, but EAI support is not compi
- declaration is incompatible with "__nounwind __interwork __softfp unsigned long __get_PSP(void)" IAR 编译报故障
- 解决: 编译警告 : “warning: function declaration isn't a prototype ”
- delphi遇到的一个实参错误(Format ‘%1’ invalid or incompatible with argument )
- Warning:android-apt plugin is incompatible with future version of Android Gradle plugin. Please use
- 错误:argument of type "char *" is incompatible with parameter of type "LPCWSTR"
- is incompatible with i386:x86-64 output
- Keil-arm警告 warning: : statement is unreachable
- 解决 declaration is incompatible with "__interwork __softfp unsigned long __get_PSP(void)" 报错