Какова цель ограничения как размер массива? - PullRequest
0 голосов
/ 09 октября 2018

Я понимаю, что означает restrict, но меня немного смущает такое использование / синтаксис:

#include <stdio.h>

char* foo(char s[restrict], int n)
{
        printf("%s %d\n", s, n);
        return NULL;
}

int main(void)
{
        char *str = "hello foo";
        foo(str, 1);

        return 0;
}

Успешно скомпилировано с gcc main.c -Wall -Wextra -Werror -pedantic

Как ограничить работув этом случае и интерпретировать компилятором?

gcc версия: 5.4.0

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Прежде всего,

  char* foo(char s[restrict], int n) { ....

совпадает с

  char* foo(char * restrict s, int n) {...

Синтаксис разрешен согласно C11, глава §6.7.6.2

[...] Необязательные квалификаторы типов и ключевое слово static должны появляться только в объявлении параметра функции с типом массива, а затем только при выводе самого внешнего типа массива.

Цель наличия restricted здесь состоит в том, чтобы намекнуть компилятору, что для каждого вызова функции фактический аргумент - only , доступ к которому осуществляется через указатель s.

0 голосов
/ 09 октября 2018

С ограничитель типа ограничителя

В объявлении функции ключевое слово restrict может появляться в квадратных скобках, которые используются для объявления типа массива параметра функции.Он определяет тип указателя, в который преобразуется тип массива:

И пример:

void f(int m, int n, float a[restrict m][n], float b[restrict m][n]);
...