2010-11-13 99 views
1

限制现在我做了一些代码,并使用了关键字限制一些问题。C带的typedef

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

你需要“的失败的码”更准确地说,你是什么意思。 – 2010-11-13 23:42:34

+0

FWIW,你的代码用GCC编译得很好。 – 2010-11-14 00:13:24

回答

0

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

编辑:虽然这是真的,你无法抵达的typedef和修改内部总是应用在顶层,在这种情况下,原来你restrict在顶层。这是一个什么样的人通常运行与const逆:typedef char *char_ptr意味着const char_ptr(或char_ptr const,他们当量)都表示“恒字符指针”而不是“指针定焦”,这是人们所希望的。 (另见本SO主题:C++ typedef interpretation of const pointers

因此,在这种情况下,我觉得typedef int *pt是否意味着restrict pt意味着int * restrict pt。这是很容易验证,因为GCC会抱怨为restrict int *x而不是restrict pt x“无效使用的‘限制’”。

+0

上帝......我需要大量的黑客然后 – rogi 2010-11-13 23:46:30

+2

你能否请克莱里?为什么'pt restrict'不表示'int * restrict'类型?我认为这个答案是错误的。 – 2010-11-13 23:54:38

+0

@Johannes:假设'restrict' “传播” 一样'const',你是正确的:'static_assert(标准:: is_same ::值, “foobar的”);'不抱怨。 – fredoverflow 2010-11-14 00:25:48

2

确保您使用的C99标志你的编译器编译它。该restrict关键字不会在C89 C.

+3

我正在使用c99。 – rogi 2010-11-13 23:47:07

+1

你的意思是ANSI C99或ANSI C89? – 2010-11-18 21:46:59

+1

@Johannes:答复已更新 - 感谢您的支持。 – Zeke 2010-11-18 23:20:14

1

有一个快速浏览和阅读此类似SO question存在,代码会是这样,作为关键字“限制”在C++编译器不保留的关键字,通过接受的答案指示在上述linky,无论是__restrict__restricted__,再次检查你的编译器...

typedef int* __restrict pt; 

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

嗯这可能会帮助很多。谢谢! – rogi 2010-11-14 00:06:09

+0

我在[一个问题](http://stackoverflow.com/q/43631062/2542702)中使用了你的答案,每个人都说这是一个非常糟糕的主意。你能评论我的问题吗? – 2017-04-27 07:04:46