реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Что делает С-оператор (void)a;, не могу найти
gerber
сообщение Jan 11 2014, 14:43
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Не могу ни вспомнить, ни найти, что делает при вызове следующая функция 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???


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Jan 11 2014, 14:47
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Ничего не делает. (void)a просто убирает предупреждение компилятора о неиспользованной переменной.
Go to the top of the page
 
+Quote Post
Lagman
сообщение Jan 11 2014, 15:09
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Если это реальный пример для реального процессора, то скорей всего используя такую функцию, адрес "some_type_t* a" передается в регистр, в какой именно надо смотреть из описания компилятора для процессора через какие регистры и как передаются параметры для функций.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 11 2014, 15:13
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



http://electronix.ru/forum/index.php?showt...=117922&hl=
Не совсем то...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 11 2014, 19:29
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Действительно не делает ничего кроме устранения предупреждения компилятора о неиспользуемой переменной. А вот если бы a была volatile-переменной, то такая запись вынуждала бы компилятор прочитать эту переменную, что бывает полезно для регистров периферии, которые сбрасываются чтением.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
gerber
сообщение Jan 11 2014, 19:37
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Спасибо, понятно.
Для принудительного чтения регистров периферии всё же было бы (void)*a, если уж a - это указатель.
Я для предотвращения варнига обычно пишу a=a;
А тут (смотрю чужой код) померещился вызов функции без параметров по указателю a, но это указатель на данные, вот, думаю, хитро закручено...
А оказалось всё просто!
P.S. А кстати - разве компилятор ругается на неиспользованные параметры функций???

Сообщение отредактировал gerber - Jan 11 2014, 19:51


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
XVR
сообщение Jan 13 2014, 12:38
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
P.S. А кстати - разве компилятор ругается на неиспользованные параметры функций???
Иногда. Подайте компилятору ключик -Wall, получите много интересной ругани sm.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 13 2014, 12:52
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(XVR @ Jan 13 2014, 15:38) *
Иногда. Подайте компилятору ключик -Wall, получите много интересной ругани sm.gif

Для Keil: --remarks

По теме - указатель превратили в ничто. Не понимаю.
Go to the top of the page
 
+Quote Post
XVR
сообщение Jan 16 2014, 08:53
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(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

Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 16 2014, 09:19
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

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

}

чем плох?
То есть, имеется некий массив функций с одним аргументом - указателем на структуру. Вызываемых по указателю на функцию. В каких-то функциях аргумент используется, а в каких-то нет. Не могу представить. laughing.gif
Go to the top of the page
 
+Quote Post
XVR
сообщение Jan 16 2014, 09:30
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(ViKo @ Jan 16 2014, 13:19) *
А вариант
Код
static inline void some_function(void)
{

}

чем плох?
Тем, что у него вообще параметра нет
Цитата
То есть, имеется некий массив функций с одним аргументом - указателем на структуру. Вызываемых по указателю на функцию. В каких-то функциях аргумент используется, а в каких-то нет.
Вы не сможете (без мата со стороны компилятора) положить в такой массив указатель на функцию без аргумента. Более того, на некоторых архитектура вы получите run-time слом, при попытке вызвать функцию без параметров как функцию с одним параметром (например 32х битный x86, calling conversion - stdcall).
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 16 2014, 10:17
Сообщение #12


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(XVR @ Jan 16 2014, 12:30) *
Вы не сможете (без мата со стороны компилятора) положить в такой массив указатель на функцию без аргумента.

Да. Я о том и говорю. Скорее всего, был массив функций с аргументами.
Иначе я писал бы сразу функцию без аргументов.
А не могу представить такого массива функций в реальности - какие-то с аргументами, какие-то нет. Для некой структуры. Хотя, если это часы, например...?
Go to the top of the page
 
+Quote Post
XVR
сообщение Jan 16 2014, 11:34
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

Например - у вас есть некий встроенный скриптовый язык, а в массиве сложены указатели на функции этого языка. И у вас есть функция, типа getenv, которая возвращает переменную окружения, в виде строки. Это самое окружение и передается в качестве параметра функции. Очевидно, что для getenv этот параметр потребуется, а для подавляющего большинства остальных функций - нет
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 02:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01487 секунд с 7
ELECTRONIX ©2004-2016