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

时间:2018-11-08 11:52:38

标签: c mplab

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

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

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

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

2 个答案:

答案 0 :(得分:3)

要传递的字符串文字的类型为import { Injectable, ErrorHandler } from '@angular/core'; import { ThirdPartyExceptionType } from 'thirdpartylibrary'; export class CustomErrorHandler implements ErrorHandler { handleError(error: Error | ThirdPartyExceptionType ) { if (error instanceof ThirdPartyExceptionType ) { // do something } else { // do something else } } ,但参数为char []

因此将参数的类型更改为unsigned char *

答案 1 :(得分:2)

简短答案:

字符串文字如"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库中的类型优先于“原始”字符类型。


使用字符类型的最佳做法:

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