我正在使用 pcre2 库,它有一个特殊的“字符串类型”,定义为 PCRE2_SPTR8
。
如果我尝试使用以下内容初始化字符串:
PCRE2_SPTR8 s = "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 = (PCRE2_SPTR8) "my string";
另外,出于好奇,为什么普通的“字符串”通常定义为 char* string = "something";
而不是 unsigned char* string = "something";
。用有符号字符和无符号字符定义字符串有什么好处/坏处吗?
答案 0 :(得分:2)
初始化这种类型的字符串的建议方法是什么?
当 PCRE2_SPTR8
不是 char *
时,类似于 OP 的想法,但更常见的是避免隐藏 *
。由于这是一个风格问题 - 请遵循您小组的风格指南。
// PCRE2_SPTR8 s = (PCRE2_SPTR8) "my string";
const unsigned char * = (unsigned char *) "my string";
另外,出于好奇,为什么普通的“字符串”通常定义为 char* string = "something";
而不是 unsigned char* string = "something";
。
在 C 中,字符串被标准库定义为:
<块引用>string 是由第一个空字符终止并包括第一个空字符的连续字符序列。
最好接近那个定义。 char* string
不是 string,而是指向 string 的指针。 unsigned char* string
也是如此。
使用 signed
与 unsigned char
定义字符串有什么优点/缺点吗?
字符串函数的 C 库表现就好像字符串元素是 unsigned char
。
对于本子条款中的所有函数,每个字符都应被解释为好像它具有 unsigned char
类型(因此每个可能的对象表示都是有效的并且具有不同的值)。
这在像 strcmp()
这样的选择案例和比较两个字符时很重要,其中一个字符可能超出 ASCII 范围。比较这些值就像 unsigned char
。在当今不使用 2 的补码的罕见平台上也很重要。
在实现类似字符串的函数时,最好用 unsigned char
实现。
在调用字符串函数时,最好使用 char
以尽量减少转换的需要。