C ограничить с помощью typedef - PullRequest
1 голос
/ 14 ноября 2010

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

typedef int* pt;

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

Что если я хочу сделать ограничения a и b ограниченными?Код ниже не удался:

typedef int* pt;

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

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

Ответы [ 3 ]

2 голосов
/ 14 ноября 2010

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

1 голос
/ 14 ноября 2010

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

typedef int* __restrict pt;

int foo(pt a, pt b)
{
 ... /* stuff */
}
0 голосов
/ 14 ноября 2010

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

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

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

...