使用char*、unsigned char*和signed char*发生别名问题

15

char *(以及相关变量)可能与任何内容进行别名。 signed char *unsigned char *(以及它们的相关变量)是否例外?

换句话说,如果我不希望它们与其他类型的指针参数重叠(因为它们可能会与它们重叠),那么将restrict 应用于 char*函数参数是个好主意:

int func(struct foo *f, char * restrict s /*different object*/);

我可以像这样删除signed和unsigned char变量的restrict关键字吗?

int sfunc(struct foo *f, signed char *s /*different object*/);
int ufunc(struct foo *f, unsigned char *s /*different object*/);

如果同一类型的有符号和无符号指针可以互相别名,那么如果我希望一个指向int的指针和一个指向unsigned的指针应该指向不同的对象,那么int *unsigned *参数是否都应该被限定为restrict

/* i and u should be different */
int uifunc(int * /*restrict?*/ i, unsigned * /*restrict?*/ u); 

3
注:原型中的 restrict 关键字并不重要(虽然它作为文档说明),只有函数定义中的版本才有效。 - M.M
1个回答

13
规则如下(C11 6.5/7):
一个对象的存储值只能通过具有以下类型之一的lvalue表达式访问:
- 与该对象的有效类型兼容的类型 - 与该对象的有效类型兼容的类型的限定版本 - 与该对象的有效类型相应的有符号或无符号类型 - 与该对象的有效类型的限定版本相应的有符号或无符号类型 - 包含上述类型之一的聚合或联合类型(包括子聚合或包含联合体成员中递归地包括的成员) - 字符类型。
注意,char、signed char和unsigned char都是字符类型(参考:6.2.5/15)。前面的规则也回答了关于有符号和无符号类型的问题。
请记住,固定宽度类型是可能引用各种其他类型的typedefs,因此要小心处理。

非常好的回答。谢谢! - Petr Skocik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接