我现在正在做一些代码并且使用限制关键字遇到了一些问题。
typedef int* pt;
int foo(pt a, pt b)
{
... /* stuff */
}
如果我想限制 a 和 b 怎么办?下面的代码失败:
typedef int* pt;
int foo(pt restrict a, pt restrict b)
{
... /* stuff */
}
提前致谢。
我现在正在做一些代码并且使用限制关键字遇到了一些问题。
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 问题,代码将是,因为关键字 '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 线程:C++ typedef 对 const 指针的解释)
所以在这种情况下,我认为typedef int *pt
确实意味着restrict pt
意味着int * restrict pt
。这很容易验证,因为 gcc 会抱怨“invalid use of 'restrict'” forrestrict int *x
但不会 for restrict pt x
。