C++ 在无符号字符数组和有符号字符数组上使用strlen时发出警告

C++ 在无符号字符数组和有符号字符数组上使用strlen时发出警告,c++,c,string,function,compiler-warnings,C++,C,String,Function,Compiler Warnings,我不明白为什么最后两行会使用strlen()引起警告。编译器不应该忽略这些吗 size_t len; char cstr[] = "char string"; signed char scstr[] = "signed char string"; unsigned char ucstr[] = "unsigned char string"; len = strlen(cstr); len = strlen(scstr); /* warns when char is unsigned */ l

我不明白为什么最后两行会使用strlen()引起警告。编译器不应该忽略这些吗

size_t len;
char cstr[] = "char string";
signed char scstr[] = "signed char string";
unsigned char ucstr[] = "unsigned char string";

len = strlen(cstr);
len = strlen(scstr);  /* warns when char is unsigned */
len = strlen(ucstr);  /* warns when char is signed */

因为原型是:

尺寸(常量字符*str)

如合同上所述

这些行中正在发生隐式转换,因此警告。请在此处阅读更多信息:


正如皮特·贝克尔所说:


char
unsigned char
涉及隐式转换。
unsigned char*
char*
,如问题中的代码,无效,需要诊断。”

char
unsigned char
涉及隐式转换<代码>无符号字符*到
字符*
,如问题中的代码中所示,无效,需要进行诊断。发出诊断(在本例中为警告)后,编译器可以继续编译代码,并具有特定于实现的含义。@PeteBecker。这会导致安全漏洞吗?谢谢@PeteBecker,我在答案中加入了这一点,当然,如果你不介意的话!:)为什么编译器会忽略这些
char*
signed char*
unsigned char*
是不兼容的类型。从形式上讲,这是一个“错误”,而不是一个“警告”。