使用char *,unsigned char *和signed char *进行别名

时间:2016-11-13 14:49:48

标签: c strict-aliasing

char *(和合格的变体)可能是别名。 是signed char *unsigned char *(以及他们的合格变体) 免除这个?

换句话说,我已经了解了将restrict应用于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 *unsigned *参数是restrict - 是否合格?< / p>

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

1 个答案:

答案 0 :(得分:4)

规则是(C11 6.5 / 7):

  

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

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

charsigned charunsigned char都是字符类型(参考:6.2.5 / 15)。早期的项目符号也会回答有关已签名和未签名类型的问题。

请记住固定宽度类型是typedef,可以引用其他各种类型,所以要小心。