将字符串定义为 char* 与 unsigned char*

时间:2021-04-11 01:17:28

标签: c

我正在使用 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";。用有符号字符和无符号字符定义字符串有什么好处/坏处吗?

1 个答案:

答案 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 也是如此。


<块引用>

使用 signedunsigned char 定义字符串有什么优点/缺点吗?

字符串函数的 C 库表现就好像字符串元素是 unsigned char

<块引用>

对于本子条款中的所有函数,每个字符都应被解释为好像它具有 unsigned char 类型(因此每个可能的对象表示都是有效的并且具有不同的值)。

这在像 strcmp() 这样的选择案例和比较两个字符时很重要,其中一个字符可能超出 ASCII 范围。比较这些值就像 unsigned char。在当今不使用 2 的补码的罕见平台上也很重要。

在实现类似字符串的函数时,最好用 unsigned char 实现。

在调用字符串函数时,最好使用 char 以尽量减少转换的需要。