Передача uint8_t вместо uint32_t в функцию (в C) - PullRequest
1 голос
/ 16 апреля 2019

Переходя к некоторому коду (написанному на языке C), я наткнулся на следующее:

//we have a parameter

uint8_t num_8 = 4;

//we have a function

void doSomething(uint32_t num_32) {....}

//we call the function and passing the parameter

doSomething(num_8);

У меня проблемы с пониманием, является ли это правильным вызовом функции или нет.Это приведение или просто ошибка?

В общем, я знаю, что в языках C / C ++ в функцию передается только копия переменной, однако я не уверен, что на самом деле происходит.Распределяет ли компилятор 32 стека в стеке (для переданного параметра), обнуляет все биты и сразу после копирования параметра?

Может ли кто-нибудь указать мне на ресурс, объясняющий механизм передачи параметра?

1 Ответ

1 голос
/ 16 апреля 2019

Поскольку объявление функции включает в себя список типов параметров, компилятор знает тип ожидаемого параметра. Затем он может косвенно привести действительный параметр к ожидаемому типу. Фактически компилятор обрабатывает вызов функции так, как если бы он был:

doSomething((uint32_t) num_8);

Старые программисты, которые когда-то использовали (не очень) хороший K & R C, могут помнить, что у pre-ansi C были только списки идентификаторов, и тип параметров не был явно объявлен. В те дни нам приходилось явно приводить параметры, а когда мы забывали, у нас не было предупреждений во время компиляции, но были ошибки во время выполнения.

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

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