私は今いくつかのコードを実行していますが、restrict キーワードを使用して問題が発生しました。
typedef int* pt;
int foo(pt a, pt b)
{
... /* stuff */
}
a と b を制限したい場合はどうすればよいですか? 以下のコードは失敗しました:
typedef int* pt;
int foo(pt restrict a, pt restrict b)
{
... /* stuff */
}
前もって感謝します。
私は今いくつかのコードを実行していますが、restrict キーワードを使用して問題が発生しました。
typedef int* pt;
int foo(pt a, pt b)
{
... /* stuff */
}
a と b を制限したい場合はどうすればよいですか? 以下のコードは失敗しました:
typedef int* pt;
int foo(pt restrict a, pt restrict b)
{
... /* stuff */
}
前もって感謝します。
コンパイラの C99 フラグを使用してコンパイルしていることを確認してください。このrestrict
キーワードは C89 C には存在しません。
この同様のSO questionをざっと見て読むと、上記のリンクで受け入れられた回答で示されているように、キーワード「restrict」は C++ コンパイラの予約済みキーワードではないため、コードは次のようになります。__restrict
または__restricted__
、もう一度コンパイラを確認してください。 ..
typedef int* __restrict pt;
int foo(pt a, pt 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' の無効な使用」について文句を言いますが、 については文句を言いrestrict int *x
ませんrestrict pt x
。