|
|
  |
Что делает С-оператор (void)a;, не могу найти |
|
|
|
Jan 11 2014, 14:43
|
Знающий
   
Группа: Участник
Сообщений: 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???
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Jan 16 2014, 08:53
|
Гуру
     
Группа: Свой
Сообщений: 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 - все счастливы
|
|
|
|
|
Jan 16 2014, 09:30
|
Гуру
     
Группа: Свой
Сообщений: 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).
|
|
|
|
|
Jan 16 2014, 11:34
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(ViKo @ Jan 16 2014, 14:17)  А не могу представить такого массива функций в реальности - какие-то с аргументами, какие-то нет. Для некой структуры. В смысле - зачем функции аргумент, если она его не использует? Это как раз вполне может быть. Аргумент может содержать какие то дополнительные данные, которые нужны далеко не всем функциям в массиве. Например - у вас есть некий встроенный скриптовый язык, а в массиве сложены указатели на функции этого языка. И у вас есть функция, типа getenv, которая возвращает переменную окружения, в виде строки. Это самое окружение и передается в качестве параметра функции. Очевидно, что для getenv этот параметр потребуется, а для подавляющего большинства остальных функций - нет
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|