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

вам нужно быть более точным, что вы имеете в виду «код ниже не удалось». –

+0

FWIW, ваш код отлично компилируется с помощью GCC. –

ответ

0

Вам нужен «ограниченный указатель на целое число» int * restrict p не «указатель на ограниченное целое число» restrict int *p, поэтому вам нужно будет сделать еще один typedef. Вы не можете «попасть внутрь» оригинального.

EDIT: Хотя это правда, что вы не можете досягаемость внутри ЬурейеЕ и модификатора всегда будет применяться на самом высоком уровне, в этом случае получается, что вы хотите 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

o бог ... мне нужно много хаков, тогда – rogi

+2

вы можете понравиться clariy? Почему бы «pt restrict» не обозначать тип 'int * restrict'? Я думаю, что этот ответ неправильный. –

+0

@Johannes: предполагая, что 'ограничивать' "распространяется" так же, как 'const', вы правы:' static_assert (std :: is_same :: значение, "foobar"); 'не жалуется , – fredoverflow

2

Убедитесь, что вы его компилируете, используя флаг C99 для вашего компилятора. Ключевое слово restrict не существует в C89 C.

+3

Я использую c99. – rogi

+1

Вы имеете в виду ANSI C99 или ANSI C89? –

+1

@Johannes: Отвечено обновлено - спасибо, что поймали это. – Zeke

1

Имея быстрый просмотр и чтение этого аналогичного SO question, код будет, поскольку ключевое слово «ограничивать» не является зарезервированным ключевым словом в компиляторах на C++, как указано принятым ответом в приведенном выше Linky, либо __restrict или __restricted__, снова проверьте ваш компилятор ...

typedef int* __restrict pt; 

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

Хм это может помочь много. благодаря! – rogi

+0

Я использовал ваш ответ в [вопросе] (http://stackoverflow.com/q/43631062/2542702), и все говорят, что это очень плохая идея. Можете ли вы прокомментировать мой вопрос? –