Sun Studio 12:C 用户指南

5.2 使用 Pragma 以便更好地控制

在基于类型的分析由于更详细而受益的情况下,您可以使用以下 pragma 覆盖已生效的别名级别,并指定转换单元中个体类型或指针变量之间的别名关系。如果转换单元中指针的使用与某个可用别名级别一致,但是一些特定指针变量的使用方法是某个可用级别不允许的不规则方法,这些 pragma 非常有益。


注 –

必须在 pragma 之前声明命名的类型或变量,否则会发出警告消息并忽略 pragma。如果 pragma 出现在其含义所适用的第一个内存引用之后,则程序的结果不确定。


下列术语用于 pragma 定义。

术语 

含义 

level

B.2.67 -xalias_level[= l]下列出的任何别名级别。

type

以下任何类型: 

  • charshortintlonglong longfloatdoublelong double

  • void,表示所有指针类型

  • typedef name,它是 typedef 声明中定义的类型的名称

  • struct name,它是后面有 struct tag 名称的关键字 struct

  • union,它是后面有 union tag 名称的关键字 union

pointer_name

转换单元中指针类型的任何变量的名称。 

5.2.1 #pragma alias_level level (list)

level 替换为以下七个别名级别之一:anybasicweaklayoutstrictstdstrong。您可以使用单一类型或逗号分隔的类型列表替换 list,也可以使用单一指针或逗号分隔的指针列表替换 list。例如,您可以按以下方式发出 #pragma alias_level

此 pragma 指定,指示的别名级别应用于所列类型的转换单元的所有内存引用,或者应用于其中某个命名指针变量正在被非关联化的转换单元的所有非关联化。

如果您指定多个要应用于特定非关联化的别名级别,则指针名称(如果有)应用的级别优先于所有其他级别。类型名称(如果有)应用的级别优先于选项应用的级别。在以下示例中,如果在编译程序时将 #pragma alias_level 设置得比 any 高,则 std 级别应用于 p


typedef int * int_ptr;
int_ptr p;
#pragma alias_level strong (int_ptr)
#pragma alias_level std (p)

5.2.1.1 #pragma alias (type, type [, type]…)

pragma 指定所有列出的类型互为别名。在以下示例中,编译器假定间接访问 *pt 的别名为间接访问 *pf


#pragma alias (int, float)
int *pt;
float *pf;

5.2.1.2 #pragma alias (pointer, pointer [, pointer] …)

此 pragma 指定,在任何命名指针变量的任何非关联化点,正被非关联化的指针值可以指向与任何其他命名指针变量相同的对象。但是,指针并不仅限于命名变量中包含的对象,可以指向列表中未包含的对象。此 pragma 覆盖应用的任何别名级别的别名假定。在以下示例中,该 pragma 之后对 pq 的任何间接访问无论是什么类型,均被视为别名。


#pragma alias(p, q)

5.2.1.3 #pragma may_point_to (pointer, variable [, variable] …)

pragma 指定,在命名指针变量的任何非关联化点,正被非关联化的指针值可以指向任何命名变量中包含的对象。但是,指针并不仅限于命名变量中包含的对象,可以指向列表中未包含的对象。此 pragma 覆盖应用的任何别名级别的别名假定。在以下示例中,编译器假定对 *p 的任何间接访问的别名可以是任何直接访问 abc


#pragma alias may_point_to(p, a, b, c)

5.2.1.4 #pragma noalias (type, type [, type]…)

pragma 指定列出的类型不互为别名。在以下示例中,编译器假定对 *p 的任何间接访问不将间接访问 *ps 作为别名。


struct S {
   float f;
   ...} *ps;

#pragma noalias(int, struct S)
int *p;

5.2.1.5 #pragma noalias (pointer, pointer [, pointer] …)

pragma 指定,在任何命名指针变量的任何非关联化点,正被非关联化的指针值不指向与任何其他命名指针变量相同的对象。此 pragma 覆盖所有其他应用的别名级别。在以下示例中,编译器假定无论两个指针是什么类型,对 *p 的任何间接访问均不将间接访问 *q 作为别名。


#pragma noalias(p, q)

5.2.1.6 #pragma may_not_point_to (pointer, variable [, variable] …)

此 pragma 指定,在命名指针变量的任何非关联化点,正被非关联化的指针值不指向任何命名变量中包含的对象。此 pragma 覆盖所有其他应用的别名级别。在以下示例中,编译器假定对 *p 的任何间接访问不将直接访问 abc 作为别名。


#pragma may_not_point_to(p, a, b, c)