1

我现在正在做一些代码并且使用限制关键字遇到了一些问题。

typedef int* pt;

int foo(pt a, pt b)
{
 ... /* stuff */
}

如果我想限制 a 和 b 怎么办?下面的代码失败:

typedef int* pt;

int foo(pt restrict a, pt restrict b)
{
 ... /* stuff */
}

提前致谢。

4

3 回答 3

2

确保使用编译器的 C99 标志编译它。restrictC89 C 中不存在该关键字。

于 2010-11-13T23:42:51.930 回答
1

快速浏览并阅读这个类似的SO 问题,代码将是,因为关键字 'restrict' 不是 C++ 编译器中的保留关键字,如上述链接中接受的答案所示,要么 要么__restrict__restricted__再次检查你的编译器。 ..

typedef int* __restrict pt;

int foo(pt a, pt b)
{
 ... /* stuff */
}
于 2010-11-13T23:43:50.400 回答
0

您需要一个“受限整数指针”int * restrict p而不是“指向受限整数的指针” restrict int *p,因此您需要创建另一个 typedef。你不能“进入”原来的那个。

编辑:虽然您确实无法进入 typedef 并且修饰符将始终应用于顶层,但在这种情况下,事实证明您想要顶层restrict。这与人们通常遇到的相反consttypedef 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

于 2010-11-13T23:40:59.877 回答