c typedefを制限します
-
09-10-2019 - |
質問
私は今いくつかのコードを行っており、制限キーワードを使用していくつかの問題を抱えています。
typedef int* pt;
int foo(pt a, pt b)
{
... /* stuff */
}
AとBを制限したい場合はどうなりますか?以下のコードが失敗しました:
typedef int* pt;
int foo(pt restrict a, pt restrict b)
{
... /* stuff */
}
前もって感謝します。
解決
「整数への制限付きポインター」が必要です int * restrict p
「制限された整数へのポインター」ではありません restrict int *p
したがって、別のtypedefを作成する必要があります。元のものを「内部に到達」することはできません。
編集:あなたは本当ですが できません typedefの内側に到達すると、修飾子は常に最上位レベルで適用されます。この場合、あなたはあなたが 欲しいです restrict
トップレベルで。それは人々が通常遭遇するものの逆です const
: typedef char *char_ptr
意味 const char_ptr
(また char_ptr const
, 、それらは同等です)両方とも、人々が望むものである「定数charへのポインター」ではなく「charへの一定のポインター」を意味します。 (これもSOスレッドを参照してください: constポインターのC ++ typedef解釈 )
この場合、私は思う typedef int *pt
それを意味します restrict pt
意味 int * restrict pt
. 。 GCCは「「制限」の無効な使用」について不平を言うので、検証するのは非常に簡単です restrict int *x
しかし、ではありません restrict pt x
.
他のヒント
コンパイラ用のC99フラグを使用してコンパイルしていることを確認してください。 restrict
キーワードはC89 Cには存在しません。
簡単に見て、これを読んでいます だから質問, 、コードは、上記のリンクで受け入れられている回答で示されるように、キーワード「制限」がC ++コンパイラのキーワードを予約していないためです。 __restrict
また __restricted__
, もう一度、コンパイラをチェックしてください...
typedef int* __restrict pt;
int foo(pt a, pt b)
{
... /* stuff */
}