将字符串定义为char*vs unsigned char*
我正在使用这个库,它有一个特殊的“字符串类型”,定义为将字符串定义为char*vs unsigned char*,c,C,我正在使用这个库,它有一个特殊的“字符串类型”,定义为PCRE2\u SPTR8 如果我尝试使用以下内容初始化字符串: PCRE2_SPTR8 s = "my string"; PCRE2_SPTR8 s = (PCRE2_SPTR8) "my string"; 我会得到一个警告,比如: warning: initializing 'PCRE2_SPTR8' (aka 'const unsigned char *') wit
PCRE2\u SPTR8
如果我尝试使用以下内容初始化字符串:
PCRE2_SPTR8 s = "my string";
PCRE2_SPTR8 s = (PCRE2_SPTR8) "my string";
我会得到一个警告,比如:
warning: initializing 'PCRE2_SPTR8' (aka 'const unsigned char *')
with an expression of type 'char [27]' converts between pointers to
integer types with different sign [-Wpointer-sign]
建议用什么方法初始化这种类型的字符串?做一些类似于:
PCRE2_SPTR8 s = "my string";
PCRE2_SPTR8 s = (PCRE2_SPTR8) "my string";
另外,出于好奇,为什么一个普通的“字符串”通常被定义为char*string=“something”
而不是无符号字符*string=“something”代码>。使用有符号和无符号字符定义字符串有什么优点/缺点吗
建议用什么方法初始化这种类型的字符串
类似于OP的想法,当PCRE2\u SPTR8
不是char*
,但更常见的是避免隐藏*
。由于这是一个风格问题,请遵循团队的风格指南
// PCRE2_SPTR8 s = (PCRE2_SPTR8) "my string";
const unsigned char * = (unsigned char *) "my string";
另外,出于好奇,为什么一个普通的“字符串”通常被定义为char*string=“something”
而不是无符号字符*string=“something”代码>
在C语言中,标准库将字符串定义为:
字符串是以第一个空字符结尾并包含该空字符的连续字符序列
最好保持接近这个定义char*string
不是字符串,而是指向字符串的指针。类似于wise for无符号字符*字符串
用有符号的
定义字符串与用无符号的字符
定义字符串相比,有什么优点/缺点吗
字符串函数的C库的行为就像字符串元素是无符号字符
对于本子条款中的所有函数,应将每个字符解释为具有类型无符号字符
(因此,每个可能的对象表示都是有效的,并且具有不同的值)
这在选择大小写(如strcmp()
中)和比较两个字符(可能有一个字符超出ASCII范围)时非常重要。这些值的比较就像无符号字符
一样。在今天很少使用2的补码的平台上也很重要
在实现类似字符串的函数时,最好使用unsigned char
实现
调用字符串函数时,最好使用char
,以尽量减少强制转换的需要。char
很奇怪,因为某些原因,编译器可以将其视为默认有符号或默认无符号。同样地,您的字符常量将继承这一点,强制使用unsigned可能会破坏一切。@tadman您能想到的一些原因是什么?不同的观点现在僵化为C标准。因为C标准将char
是有符号的还是无符号留给实现。请参阅(这只是他们发现折磨C程序员的另一种方式:)
@carl.hiass在C中,int,long,short
无符号
是有符号的。将这一想法扩展到char,它也会被签名,这似乎很自然。然而,有符号的char
对于非2的补码来说是非常有问题的,因为现在有两个0编码(或者更糟的是一个陷阱)。这类机器的char
是无符号的。与ASCII 0-127不同,它还使用了0-255个字符的编码,并使用了无符号的字符
。C折衷:char
是一种不同于signed char
和unsigned char
的类型,并匹配其中一种字符的范围/大小。我认为这大约涵盖了:)