Oracle® Developer Studio 12.5:C 用户指南

退出打印视图

更新时间: 2016 年 7 月
 
 

6.2 使用 Pragma 以便更好地控制

如果进行基于类型的分析时,更详细的信息可为您提供帮助,则可以使用本节中说明的 pragma 覆盖已生效的别名级别,并指定转换单元中个体类型或指针变量之间的别名关系。如果转换单元中指针的使用与某个可用别名级别一致,而一些特定指针变量的使用方法是某个可用级别不允许的不规则方法,这些 pragma 非常有益。


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

下表中列出的术语用于 pragma 定义。

术语
含义
level
-xalias_level[=l]下所列的任何别名级别。
type
以下任何类型:
  • char, short, int, long, long long, float, double, long double

  • void,表示所有指针类型

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

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

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

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

6.2.1 #pragma alias_level level (list)

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

  • #pragma alias_level level (type [, type])

  • #pragma alias_level level (pointer [, pointer])

此 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)

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

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

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

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

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

#pragma alias(p, q)

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

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

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

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

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

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

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

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

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

#pragma noalias(p, q)

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

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

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

6.2.1.7 #pragma ivdep

ivdep pragma 指示编译器忽略在循环中找到的部分或全部对数组引用的循环附带依赖性,以进行优化。这样,编译器就可以执行各种循环优化,例如微向量化、分发、软件流水操作等,其他情况下,无法执行这些优化。当用户知道这些依赖性无关紧要或者实际上永远不会发生时,可以使用该指令。

#pragma ivdep 指令的解释依赖于 —xivdep 选项的值。