一个char *(合格的变体)可以别名任何东西。是signed char *和unsigned char *(和他们的合格变种)从此免除?
换句话说,如果我不希望restrict将char*函数参数用作其他类型的指针参数的别名(因为它们可以对它们进行别名),则将其应用于函数参数是一个好主意:
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)
规则是(C11 6.5 / 7):
一个对象只能通过具有以下类型之一的左值表达式访问其存储值:
- 与对象的有效类型兼容的类型,
- 与对象的有效类型兼容的类型的限定版本,
- 类型是与对象的有效类型相对应的有符号或无符号类型,
- 一种类型,是与对象的有效类型的限定版本相对应的有符号或无符号类型,
- 在其成员(包括递归地,子集合或包含的联盟的成员)中包括上述类型之一的集合或联合类型,或
- 字符类型。
char,signed char和unsigned char都是字符类型(参照6.2.5 / 15)。较早的项目符号还回答了有关有符号和无符号类型的问题。
请记住,固定宽度类型是typedef,可以引用其他各种类型,因此请务必注意。