我在我的项目中使用strlen()
调用,直到现在我编译了没有-Wall
编译器选项的项目。但是当我开始使用-Wall
时,我面临着如此多的编译器警告。 80%是strlen char * vs const char * warning。
我知道所有strlen()
次调用的类型。有没有其他方法可以抑制以下警告?
./Proj.c:3126: warning: pointer targets in passing argument 1 of
'strlen' differ in signedness`
C:/staging/usr/include/string.h:397: note: expected 'const char *' but
argument is of type 'unsigned char *'`
答案 0 :(得分:4)
strlen
需要const char*
作为输入。
不幸的是,C标准规定char
的签名归结为编译器和平台。因此,许多程序员选择使用char
或signed char
明确设置unsigned char
的签名。
但如果char*
符合您的预期,那么这样做会导致发出警告。
幸运的是,在strlen
的背景下,采取C风格演员是安全的:使用strlen((const char*)...);
答案 1 :(得分:1)
总有选择:
inline size_t u_strlen(unsigned char * array)
{
return strlen((const char*)array);
}
这样您就不必在代码中的任何位置添加转换。
虽然问题仍然存在,但为什么使用unsigned char?我认为它是网络上数据包的字节数组,在这种情况下你应该照顾协议中的长度。
答案 2 :(得分:0)
char*
vs const char*
不是问题,这不是报告的问题(因为它不是问题)。问题在于您使用的是unsigned char*
。是否签名或未签名的普通char
是否依赖于实现;所以在某些平台unsigned char*
上会char*
,而在其他平台上则不会。{/ p>
最好的解决方案是通过不将字符串和字符串指针限定为unsigned
来确保类型一致;它几乎肯定没有用处。对于字符串和字符,有符号和无符号之间的区别是无关紧要的 - 只有在执行算术和将char
用作"小整数"时才有意义。
大多数编译器都支持命令行开关来指定char
的默认签名;但我不建议作为解决方案,也不建议铸造;正确的类型协议应始终是您的首选。