将 level 替换为以下七个别名级别之一: any、basic、weak、layout、strict、std 或 strong。您可以使用单一类型或逗号分隔的类型列表替换 list,也可以使用单一指针或逗号分隔的指针列表替换 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) |
此 pragma 指定所有列出的类型互为别名。在以下示例中,编译器假定间接访问 *pt 的别名为间接访问 *pf。
#pragma alias (int, float) int *pt; float *pf; |
此 pragma 指定,在任何命名指针变量的任何非关联化点,正被非关联化的指针值可以指向与任何其他命名指针变量相同的对象。但是,指针并不仅限于命名变量中包含的对象,可以指向列表中未包含的对象。此 pragma 覆盖应用的任何别名级别的别名假定。在以下示例中,该 pragma 之后对 p 和 q 的任何间接访问无论是什么类型,均被视为别名。
#pragma alias(p, q) |
此 pragma 指定,在命名指针变量的任何非关联化点,正被非关联化的指针值可以指向任何命名变量中包含的对象。但是,指针并不仅限于命名变量中包含的对象,可以指向列表中未包含的对象。此 pragma 覆盖应用的任何别名级别的别名假定。在以下示例中,编译器假定对 *p 的任何间接访问的别名可以是任何直接访问 a、b 和 c。
#pragma alias may_point_to(p, a, b, c) |
此 pragma 指定列出的类型不互为别名。在以下示例中,编译器假定对 *p 的任何间接访问不将间接访问 *ps 作为别名。
struct S { float f; ...} *ps; #pragma noalias(int, struct S) int *p; |
此 pragma 指定,在任何命名指针变量的任何非关联化点,正被非关联化的指针值不指向与任何其他命名指针变量相同的对象。此 pragma 覆盖所有其他应用的别名级别。在以下示例中,编译器假定无论两个指针是什么类型,对 *p 的任何间接访问均不将间接访问 *q 作为别名。
#pragma noalias(p, q) |
此 pragma 指定,在命名指针变量的任何非关联化点,正被非关联化的指针值不指向任何命名变量中包含的对象。此 pragma 覆盖所有其他应用的别名级别。在以下示例中,编译器假定对 *p 的任何间接访问不将直接访问 a、b 或 c 作为别名。
#pragma may_not_point_to(p, a, b, c) |