Вопрос

Я сейчас делаю код и получил некоторую проблему, используя ограничить ключевое слово.

typedef int* pt;

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

Что если я хочу сделать и B ограниченным? Не удалось: код ниже:

typedef int* pt;

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

Заранее спасибо.

Это было полезно?

Решение

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

Редактировать: пока это правда, что вы не мочь достичь внутри Typedef и модификатор всегда будет применяться на верхнем уровне, в этом случае оказывается, что вы хотеть то restrict на верхнем уровне. Это обратное о том, что люди обычно бегают с const: typedef char *char_ptr означает const char_ptr (или char_ptr const, они эквивалентны) оба подразумевают «постоянный указатель для CHAR», а не «указатель постоянному символу», что хочет люди. (См. Также это так поток: C ++ Typedef Интерпретация указателей Const )

Так что в этом случае я думаю typedef int *pt Значит это restrict pt означает int * restrict pt. Отказ Это довольно легко проверить, потому что GCC будет жаловаться на «Недопустимое использование« ограничения »» restrict int *x Но не для restrict pt x.

Другие советы

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

Быстро выглядеть и читаю это похоже Поэтому вопрос, код будет, поскольку ключевое слово «restrict» не зарезервировано ключевое слово в компиляторах C ++, как указано принятым ответом в приведенном выше ссылках, либо __restrict или __restricted__, Опять же, проверьте ваш компилятор ...

typedef int* __restrict pt;

int foo(pt a, pt b)
{
 ... /* stuff */
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top