A char *
(和合格的变体)可以为任何东西起别名。
是signed char *
and unsigned char *
(及其合格的变体)
不受此限制?
换句话说,我了解到申请是个好主意restrict
to char*
函数参数,如果我不希望它们为其他类型的指针参数别名(因为它们可以为它们别名):
int func(struct foo *f, char * restrict s /*different object*/);
我可以放弃restrict
像这样的有符号和无符号字符变体的关键字?
int sfunc(struct foo *f, signed char *s /*different object*/);
int ufunc(struct foo *f, unsigned char *s /*different object*/);
也可能指向同一类型的有符号和无符号变体
互相别名?换句话说,如果我期望一个指向 int 的指针和一个指向 unsigned 的指针,并且它们应该指向不同的对象,那么int *
and unsigned *
参数各为restrict
-合格的?
/* i and u should be different */
int uifunc(int * /*restrict?*/ i, unsigned * /*restrict?*/ u);
规则是(C11 6.5/7):
对象的存储值只能由具有以下类型之一的左值表达式访问:
- 与对象的有效类型兼容的类型,
- 与对象的有效类型兼容的类型的限定版本,
- 与对象的有效类型相对应的有符号或无符号类型,
- 与对象有效类型的限定版本相对应的有符号或无符号类型的类型,
- 聚合或联合类型,其成员中包含上述类型之一(递归地包括子聚合或包含联合的成员),或者
- 一种字符类型。
char
, signed char
and unsigned char
都是字符类型(参考:6.2.5/15)。前面的项目符号还回答了有关签名和未签名类型的问题。
请记住,固定宽度类型是 typedef,它可能引用各种其他类型,因此请小心。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)