将字符串传递给 char* 时出现警告 359

Warning 359 when passing string to char*

我正在尝试将字符串传递给函数:

void PassString(unsigned char * value)
{
    // ...
}

int main(void)
{
    while(1)
    {
        PassString("TEST");
    }
}

我收到警告:(359) 指针类型之间的非法转换。

传递的字符串文字是 char [] 类型,但给出的参数是 unsigned char *

因此将参数的类型更改为 char[]

简答:

"TEST" 等字符串文字在 C 中属于 char[] 类型。

因此将函数更改为接受char*。或者将参数转换为 unsigned char*,即使这是一个不太干净的解决方案。


背后的一些历史char:

C 类型系统在字符类型方面有点功能失调。在恐龙出现在地球的早期,没有指定 char 默认应该是 signed 还是 unsigned

signed 是有道理的,因为这使得 char 与更大的整数类型一致。 unsigned 也有道理,因为不存在带负索引的字符符号表。

语言标准化后,已经存在各种编译器char 不同的符号。因此决定 char 的符号应该由实现定义。即:每个编译器决定。

出于同样的原因,类型 charsigned charunsigned char 被声明为 3 种不同的类型。这意味着您不能在指向这些类型的指针之间进行隐式转换。相反,您需要通过强制转换使用显式转换。

只有字符类型表现得如此奇怪。例如,如果 intsigned int 它们总是兼容的,并且 int 总是有符号的。

这是C语言的一个已知缺点。因此,stdint.h 库中的类型优于 "raw" 字符类型。


使用字符类型的最佳实践:

  • 如果要处理(最多 8 位)文本字符串,请使用类型 char,然后
  • 如果您正在处理原始二进制数据或进行类型双关等,请使用类型 unsigned charuint8_t
  • 如果您要进行带符号的 8 位整数运算,请使用 signed charint8_t
  • 如果要进行无符号 8 位整数运算,请使用 unsigned charuint8_t
  • 除非符号很重要,否则在各种字符类型之间转换永远不会有任何危险。
  • 但是...在对这些类型进行任何形式的算术运算时要小心,因为它有很多陷阱。参见