使用char *,unsigned char *和signed char *的别名

PSk*_*cik 7 c strict-aliasing

一个char *(合格的变体)可以别名任何东西。是signed char *unsigned char *(和他们的合格变种)从此免除?

换句话说,如果我不希望restrictchar*函数参数用作其他类型的指针参数的别名(因为它们可以对它们进行别名),则将其应用于函数参数是一个好主意:

int func(struct foo *f, char * restrict s /*different object*/);
Run Code Online (Sandbox Code Playgroud)

可以restrict像这样删除带符号和无符号char变体的关键字吗?

int sfunc(struct foo *f, signed char *s /*different object*/);
int ufunc(struct foo *f, unsigned char *s /*different object*/);
Run Code Online (Sandbox Code Playgroud)

同样,指向相同类型的有符号和无符号变量的指针是否也可以互为别名?换句话说,如果我期望一个指向int的指针和一个指向unsigned的指针,并且它们应该指向不同的对象,则int *unsigned *参数应该都被restrict限定吗?

/* i and u should be different */
int uifunc(int * /*restrict?*/ i, unsigned * /*restrict?*/ u); 
Run Code Online (Sandbox Code Playgroud)

M.M*_*M.M 7

规则是(C11 6.5 / 7):

一个对象只能通过具有以下类型之一的左值表达式访问其存储值:

  • 与对象的有效类型兼容的类型,
  • 与对象的有效类型兼容的类型的限定版本,
  • 类型是与对象的有效类型相对应的有符号或无符号类型,
  • 一种类型,是与对象的有效类型的限定版本相对应的有符号或无符号类型,
  • 在其成员(包括递归地,子集合或包含的联盟的成员)中包括上述类型之一的集合或联合类型,或
  • 字符类型。

charsigned charunsigned char都是字符类型(参照6.2.5 / 15)。较早的项目符号还回答了有关有符号和无符号类型的问题。

请记住,固定宽度类型是typedef,可以引用其他各种类型,因此请务必注意。