我正在尝试将字符串传递给函数:
void PassString(unsigned char * value)
{
// ...
}
int main(void)
{
while(1)
{
PassString("TEST");
}
}
我收到警告:(359)指针类型之间的非法转换。
答案 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
的签名应由实现定义。那就是:每个编译器都决定。
出于相同的原因,类型char
,signed char
和unsigned char
被声明为3种不同的类型。这意味着您不能在指向这些类型的指针之间隐式转换。相反,您需要通过强制转换使用显式转换。
只有字符类型表现得很奇怪。如果您以int
和signed int
为例,它们总是兼容的,并且int
始终是签名的。
这是C语言的一个已知缺点。因此,stdint.h
库中的类型优先于“原始”字符类型。
使用字符类型的最佳做法:
char
,然后使用 only 。unsigned char
或uint8_t
。signed char
或int8_t
。unsigned char
或uint8_t
。