5.2.1 #pragma alias_level level (list)
5.2.1.1 #pragma alias (type, type [, type]...)
5.2.1.2 #pragma alias (pointer, pointer [, pointer] ...)
5.2.1.3 #pragma may_point_to (pointer, variable [, variable] ...)
5.2.1.4 #pragma noalias (type, type [, type]...)
5.2.1.5 #pragma noalias (pointer, pointer [, pointer] ...)
5.2.1.6 #pragma may_not_point_to (pointer, variable [, variable] ...)
5.3.2 構造体ポインタへの void ポインタのキャスト
より詳細に設定したほうが型に基づいた解析に望ましい場合、次のプラグマを使用すると、適用されている別名レベルを無効にし、個々の型または翻訳単位のポインタ変数間で別名設定の関係性を指定できます。これらのプラグマは、翻訳単位におけるポインタの用法がいずれかの別名レベルと一貫していても、少数の特定ポインタ変数がいずれかのレベルで許可されていない不規則な方法で使用される場合にもっとも役立ちます。
注 - プラグマより先に命名済みの型または変数を宣言する必要があります。この作業を怠ると、警告メッセージが発行され、プラグマが無視されます。プラグマの意味の適用される最初のメモリー参照のあとにプラグマを配置した場合、プログラムは未定義の結果を生成します。
プラグマの定義において、次の用語を使用します。
|
level は、次の別名レベルのいずれかと置き換えます。any、basic、weak、layout、strict、std、または strong。list は、単一の型またはコンマで区切った型のリストと置き換えることも、単一のポインタまたはコンマで区切ったポインタのリストで置き換えることもできます。たとえば、#pragma alias_level を次のように発行できます。
#pragma alias_level level (type [, type] )
#pragma alias_level level (pointer [, pointer] )
このプラグマは、指定の別名レベルがリストの型に対応する翻訳単位のすべてのメモリー参照、または命名済みのポインタ変数が参照解除されている翻訳単位のすべての参照解除に適用されることを指定します。
特定の参照解除に対し複数の別名レベルを指定した場合、ポインタ名によって適用されたレベルがほかのすべてのレベルに優先します。型名によって適用されたレベルは、オプションによって適用されたレベルに優先します。次の例では、#pragma alias_level を any より上位に設定してプログラムをコンパイルした場合に、std レベルが p に適用されます。
typedef int * int_ptr; int_ptr p; #pragma alias_level strong (int_ptr) #pragma alias_level std (p)
このプラグマは、リストされているすべての型が相互に別名設定することを指定します。次の例では、コンパイラは、間接アクセス *pt が間接アクセス *pf を別名設定することを仮定します。
#pragma alias (int, float) int *pt; float *pf;
このプラグマは、命名済みのポインタ変数の参照解除の地点で、参照解除されているポインタ値がそのほかの命名済みポインタ変数と同じオブジェクトをポイントできることを指定します。ただし、ポインタは、命名済みの変数に含まれるオブジェクトだけに制限されず、リストに含まれていないオブジェクトをポイントできます。このプラグマは、適用される別名レベルの別名設定仮定を無効にします。次の例では、プラグマに続く間接アクセス p と q が (2 つのポインタの型に関係なく) 別名設定すると見なされます。
#pragma alias(p, q)
このプラグマは、命名済みのポインタ変数の参照解除の地点で、参照解除されているポインタ値が命名済みの変数に含まれているオブジェクトにポイントできることを指定します。ただし、ポインタは、命名済みの変数に含まれるオブジェクトだけに制限されず、リストに含まれていないオブジェクトをポイントできます。このプラグマは、適用される別名レベルの別名設定仮定を無効にします。次の例では、コンパイラは、間接アクセス *p が直接アクセス a、b、および c を別名設定すると仮定します。
#pragma alias may_point_to(p, a, b, c)
このプラグマは、リストされている型が相互に別名設定しないことを指定します。次の例では、コンパイラは、間接アクセス *p が間接アクセス *ps を別名設定しないと仮定します。
struct S { float f; ...} *ps; #pragma noalias(int, struct S) int *p;
このプラグマは、命名済みのポインタ変数の参照解除の地点で、参照解除されているポインタがそのほかの命名済みポインタ変数と同じオブジェクトをポイントしないことを指定します。このプラグマは、適用されているそのほかすべての別名レベルを無効にします。次の例では、コンパイラは、間接アクセス *p が間接アクセス *q を (2 つのポインタの型に関係なく) 別名設定しないことを仮定します。
#pragma noalias(p, q)
このプラグマは、命名済みのポインタ変数の参照解除の地点で、参照解除されているポインタ値が命名済みの変数に含まれているオブジェクトをポイントしないことを指定します。このプラグマは、適用されているそのほかすべての別名レベルを無効にします。次の例では、コンパイラは、間接アクセス *p が直接アクセス a、b、または c を別名設定しないことを仮定します。
#pragma may_not_point_to(p, a, b, c)