2010-11-13 100 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