Параметры массива могут совпадать друг с другом, и компилятор должен тщательно учитывать эту возможность. Так, например: GodBolt
int foo(int a[10], int b[10]) {
a[0] += b[0];
return a[0] + b[0];
}
int bar(int *a, int *b) {
a[0] += b[0];
return a[0] + b[0];
}
int baz(int * __restrict a, int * __restrict b) {
a[0] += b[0];
return a[0] + b[0];
}
скомпилированный код для foo() должен быть похож на код bar(), а не на код baz().
Я хочу использовать параметры массива для своей функции - возможно, даже многомерные массивы (а не массивы указателей; те, которые вы объявляете с помощью пары квадратных скобок и распадаетесь на простые одноуровневые указатели на первый элемент). И я также хочу, чтобы компилятор предполагал, что псевдонимов нет, т. е. я хочу пометить параметры моего массива как restrict.
Как я могу сделать это в C? А если я не могу - почему?
Я не следую. Вы не можете передать массив функции в C. В языке нет способа выразить это. Когда вы указываете аргумент функции, имеющий тип массива, он автоматически преобразуется в указатель на первый элемент массива, как и почти во всех других контекстах выражений. Функция получает указатель, и вы можете объявить этот указатель restricted, если хотите.
Вы же понимаете, что (1) и (2) полностью эквивалентны, верно? Даже если окажется, что это невозможно с помощью синтаксиса массива (неважно, очевидно, что это возможно, см. ссылку выше), вы все равно можете использовать int (*__restrict a)[42] вместо int a[10][42], чтобы добиться того же самого.
@JohnBollinger: я не собираюсь передавать массив по значению. Это «на самом деле» просто переданный указатель. Вопрос в том, как объявить это ограничение для параметра массива?
Первый комментарий ссылается на ответ, но на самом деле вопрос касается только синтаксического сахара.
@Mat: Кажется, это ответ. Отметил это как обман.
Не нужно пугающих цитат. Это действительно просто указатель. Это возвращает меня к непониманию вопроса. Как вы думаете, чем эта ситуация отличается от любой другой ситуации с параметром указателя, которая представляет сложность для restrict?
@JohnBollinger: Как сказал Юджин Ш - только синтаксис. Это не интуитивно понятно.



Вы можете поместить квалификаторы в самое левое объявление массива параметра (т. е. в ту часть, которая преобразуется в указатель):
int foo(int a[restrict 10], int b[restrict 10]) {
a[0] += b[0];
return a[0] + b[0];
}
Кажется, это действительно ответ. Но уже есть вопрос с похожим ответом, поэтому мне интересно, голосовать за него и принимать или нет. Ах, что ж, давайте просто сделаем это.
Поскольку я не понимаю значения атрибутов OP для использования здесь синтаксиса массива вместо синтаксиса указателей, кажется разумным отметить, что, если static не входит в число заданных квалификаторов, числовое измерение в таком объявлении параметра не является семантически значимым.