传递'strlen'的参数1在签名方面有所不同

时间:2014-11-27 15:34:24

标签: c strlen

我在我的项目中使用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 *'`

3 个答案:

答案 0 :(得分:4)

strlen需要const char*作为输入。

不幸的是,C标准规定char的签名归结为编译器和平台。因此,许多程序员选择使用charsigned 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的默认签名;但我不建议作为解决方案,也不建议铸造;正确的类型协议应始终是您的首选。