Преобразует ли прототип функции ваши фактические параметры в C? - PullRequest
1 голос
/ 09 апреля 2019

Если вы читаете справочную страницу linux какой-либо функции и в прототипе используется ключевое слово типа static или restrict для какого-либо формального параметра, компилятор C автоматически преобразует ваш var, если тип все еще совпадает?

Например:

Прототип функции: int function_name(int* restrict param1, static int param2);

Программа:

int *my_var1;
int my_var2;

//initialization
(..)

function_name(my_var1, my_var2);

(..)

function_name() Преобразует или обрабатывает мои переменные так, как они были объявлены с помощью restrict и static в каждом случае из-за того, что тип остается прежним?

Ответы [ 2 ]

4 голосов
/ 09 апреля 2019

Один аргумент int не может быть static, который не имеет значения. Пожалуйста, приведите реальные реальные примеры, чтобы убедиться, что мы говорим об одном и том же.

Когда дело доходит до restrict, он используется для выражения того, что указанный им указатель является единственным указателем, указывающим на этот конкретный объект (более или менее, я упрощаю). Поэтому не имеет смысла говорить о «преобразовании» указателя в restrict ed, независимо от того, действительно ли применяется квалификатор, зависит от того, как используется указатель.

В общем случае аргументы будут преобразованы, чтобы соответствовать тому, что ожидает функция, когда это возможно.

0 голосов
/ 09 апреля 2019

Прежде всего, int function_name(int* restrict param1, static int param2); недействительно.При компиляции в gcc 8.3 вы получите следующие ошибки:

<source>:1:52: error: storage class specified for parameter 'param2'
 int function_name(int* restrict param1, static int param2);

Из cpprefrence неявных преобразований :

Преобразование как по присваиванию

...

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

...

Указатель на неквалифицированный тип может быть неявно преобразован в указатель на квалифицированную версию этого типа (другими словами, могут быть добавлены квалификаторы const, volatile и restrict. Исходный указатель и результатсравнивать равно.

Вы можете преобразовать тип int*:

int *p;

в volatile const int * restrict volatile const:

volatile const int * restrict volatile const other_p = p;

без ошибок.

Преобразует ли function_name () или обрабатывает мои переменные так, как они были объявлены с помощью restrict и static в каждом случае, потому что тип все тот же?

Да. Переменные "неявно соnverted "для типов в списке параметров функции.Они будут рассматриваться как объявленные внутри функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...