Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Что делает С-оператор (void)a;
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
gerber
Не могу ни вспомнить, ни найти, что делает при вызове следующая функция some_function:
Код
typedef struct
{
  int d0;
  int d1;
  int d2;
} some_type_t;
...................................
some_type_t AAA;
...................................
static inline void some_function(some_type_t* a)
{
  (void)a;
}
..................................
while(1)
{
  some_function(&AAA);
}

Со static, inline, void всё понятно.
Но что делает тело функции some_function с данными, переданными по указателю на AAA???
andrewlekar
Ничего не делает. (void)a просто убирает предупреждение компилятора о неиспользованной переменной.
Lagman
Если это реальный пример для реального процессора, то скорей всего используя такую функцию, адрес "some_type_t* a" передается в регистр, в какой именно надо смотреть из описания компилятора для процессора через какие регистры и как передаются параметры для функций.
ViKo
http://electronix.ru/forum/index.php?showt...=117922&hl=
Не совсем то...
Сергей Борщ
Действительно не делает ничего кроме устранения предупреждения компилятора о неиспользуемой переменной. А вот если бы a была volatile-переменной, то такая запись вынуждала бы компилятор прочитать эту переменную, что бывает полезно для регистров периферии, которые сбрасываются чтением.
gerber
Спасибо, понятно.
Для принудительного чтения регистров периферии всё же было бы (void)*a, если уж a - это указатель.
Я для предотвращения варнига обычно пишу a=a;
А тут (смотрю чужой код) померещился вызов функции без параметров по указателю a, но это указатель на данные, вот, думаю, хитро закручено...
А оказалось всё просто!
P.S. А кстати - разве компилятор ругается на неиспользованные параметры функций???
XVR
Цитата
P.S. А кстати - разве компилятор ругается на неиспользованные параметры функций???
Иногда. Подайте компилятору ключик -Wall, получите много интересной ругани sm.gif
ViKo
Цитата(XVR @ Jan 13 2014, 15:38) *
Иногда. Подайте компилятору ключик -Wall, получите много интересной ругани sm.gif

Для Keil: --remarks

По теме - указатель превратили в ничто. Не понимаю.
XVR
Цитата(ViKo @ Jan 13 2014, 16:52) *
По теме - указатель превратили в ничто. Не понимаю.
Давайте по шагам:
Код
static inline void some_function(some_type_t* a)
{
}
Предупреждение - 'unused parameter'. Логично - параметр передали но не использовали, спрашивается - зачем передавали?
Попробуем использовать параметр, но так, что бы не было лишнего кода (как то не хочется истреблять варнинг такой ценой) -
Код
static inline void some_function(some_type_t* a)
{
a;
}
Вполне валидный код, ничего не делает, и использует параметр 'a'. Имеем другое предупреждение - 'Code has no effect', т.е. п2 из предыдущего предложения в полный рост - 'Код ничего не делает'. Т.е. есть выражение, оно как то вычисляется, никаких побочных эффектов у него нет, но результат не используется. Подозрительно - зачем вычисляли?
И наконец вариант -
Код
static inline void some_function(some_type_t* a)
{
(void)a;
}
Теперь и параметр использован, и выражение имеет тип void, что обозначает невозможность его дальнейшего использования. Т.е. отсутствие использования результата уже не подозрительно - его в принципе нельзя использовать.

Имеем happy end - все счастливы sm.gif

ViKo
Цитата(XVR @ Jan 16 2014, 11:53) *
Имеем happy end - все счастливы sm.gif

А вариант
Код
static inline void some_function(void)
{

}

чем плох?
То есть, имеется некий массив функций с одним аргументом - указателем на структуру. Вызываемых по указателю на функцию. В каких-то функциях аргумент используется, а в каких-то нет. Не могу представить. laughing.gif
XVR
Цитата(ViKo @ Jan 16 2014, 13:19) *
А вариант
Код
static inline void some_function(void)
{

}

чем плох?
Тем, что у него вообще параметра нет
Цитата
То есть, имеется некий массив функций с одним аргументом - указателем на структуру. Вызываемых по указателю на функцию. В каких-то функциях аргумент используется, а в каких-то нет.
Вы не сможете (без мата со стороны компилятора) положить в такой массив указатель на функцию без аргумента. Более того, на некоторых архитектура вы получите run-time слом, при попытке вызвать функцию без параметров как функцию с одним параметром (например 32х битный x86, calling conversion - stdcall).
ViKo
Цитата(XVR @ Jan 16 2014, 12:30) *
Вы не сможете (без мата со стороны компилятора) положить в такой массив указатель на функцию без аргумента.

Да. Я о том и говорю. Скорее всего, был массив функций с аргументами.
Иначе я писал бы сразу функцию без аргументов.
А не могу представить такого массива функций в реальности - какие-то с аргументами, какие-то нет. Для некой структуры. Хотя, если это часы, например...?
XVR
Цитата(ViKo @ Jan 16 2014, 14:17) *
А не могу представить такого массива функций в реальности - какие-то с аргументами, какие-то нет. Для некой структуры.
В смысле - зачем функции аргумент, если она его не использует? Это как раз вполне может быть. Аргумент может содержать какие то дополнительные данные, которые нужны далеко не всем функциям в массиве.

Например - у вас есть некий встроенный скриптовый язык, а в массиве сложены указатели на функции этого языка. И у вас есть функция, типа getenv, которая возвращает переменную окружения, в виде строки. Это самое окружение и передается в качестве параметра функции. Очевидно, что для getenv этот параметр потребуется, а для подавляющего большинства остальных функций - нет
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.