Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование к void, Зачем? 
:(
    Опции темы
Дрон
  Дата 29.8.2005, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Каков смысл следующего выражения, которое я уже несколько раз встречал:
Код
(void) SomeFunction();


Подозреваю, что глубокого смысла нет, но всё таки любопытно smile


--------------------
Да. Именно так.
PM   Вверх
Void
Дата 29.8.2005, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Наверное, смысл в том, чтобы явно показать, что возвращаемое значение игнорируется. Может быть, отмазка от соответствующего варнинга компилятора. Ничего другого в голову не приходит.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
LuckLess
Дата 29.8.2005, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: 1
Всего: 1



может преобразование типа (void*)SomeFunction ??тогда смысл ясен..
PM MAIL   Вверх
Orlan
Дата 30.8.2005, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



А помоему никакой разницы нету. На тело функции это не повлияет, а если это встроеная функция, то компилятор и так произведет оптимизацию и не будет реагировать на результат.
Есть другое выражение:
Код

#define SOME_MACRO(f) (void)(f)

Так оно значит, что макрос ничего не возвратит даже если функция f что то и возвращает
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
_hunter
Дата 30.8.2005, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



Дрон, а полностью кусок кода можно? потому как в таком виде он ни о чем не говорит...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Дрон
Дата 30.8.2005, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(_hunter @ 30.8.2005, 12:06)
Дрон, а полностью кусок кода можно?

Нельзя smile

Ну, вот один из примеров:
Код

if (condition)
    (void) BlaBlaBla(param);

Иногда просто одна строчка
Код
(void) BlaBlaBla(param);


где BlaBlaBla является функцией
Код
bool BlaBlaBla(int param);


Это сообщение отредактировал(а) Дрон - 30.8.2005, 12:21


--------------------
Да. Именно так.
PM   Вверх
_hunter
Дата 30.8.2005, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



тогда хз smile
единственное предположение -- при таком кастинге компилятор не будет тратится на получение результата функции ( один регистр съэкономит ) но смысл?..


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Mayk
Дата 30.8.2005, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Может это просто памятка типа "ф-ция что-то возвращает, если что-то будет глючить, то стоит проверить здесь"?



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 30.8.2005, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



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


--------------------
qqq
PM WWW   Вверх
Orlan
  Дата 30.8.2005, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



Цитата(maxim1000 @ 30.8.2005, 14:58)
может, посмотреть, какой ассемблерный код генерируется с этой приставкой и без нее
если отличий не будет, значит, приведение нужно для каких-то дргуих компиляторов на каких-то других платформах...

При компиляции cl.exe из Visual C++ 7.1 с параметрами по умолчанию отличий в дизасемблированом коде нету.
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
srd
Дата 30.8.2005, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Нашёл кое-что. Самое интересное ближе к концу smile

Цитата

let SP be the stack pointer and let FP be the frame pointer, both
pointing into a stack. A stack frame has the following layout:

+-------------+
n+m+4: |local var_m | <-- SP
+-------------+
| ... |
+-------------+
n+4: local var_0 |
+-------------+
n+3: |old frame ptr| <-- FP
+-------------+
n+2: |return addr |
+-------------+
n+1: |return value |
+-------------+
n: |parameter_n |
+-------------+
| ... |
+-------------+
0: |parameter_0 |
+-------------+

Just before calling a function, the parameters are pushed on slots
0 ... n, an empty slot (to be set by the callee) is pushed at location
n+1 and a call (or jump subroutine) causes the return address to be
pushed at stack location n+2. The callee sets up its own stack frame
by pushing the old frame pointer (set by the caller) at location n+3,
and it makes room for its own local variables by pushing the stack
pointer upwards. After doing what it had to do, the callee stores
its return value in a slot located at the stack pointed to by FP-2,
it resets the SP register using the FP register, pops the old FP
value and finally returns (note that those operations set the SP
register to the slot where the return address is located.)

We're back at the callers level now. The return value is located
where SP points to. The caller has to reset the SP register below
the location where parameter_0 was stored (it knows how to do that,
'cause it knows the number of parameters pushed before calling the
callee function.) It is free to discard any return value before
resetting the SP register just below slot 0.

Here's the point: assume that `(void)f()' makes the compiler skip
the pushing of the empty slot where the return value has to be
stored (location n+1) and assume that function f() doesn't take
any parameters. Also assume that function f() was already compiled,
(say, it's somewhere in a standard library.) Function f() _does_
return a value and it will store its return value at location
FP-2, which accidentally happens to point _below_ location 0,
therefore destroying data local to the calling function.

The conclusion must be: a compiler can _never_ skip the allocation
step for a return value on a stack, but it can _always_ safely
discard any value, returned by the callee, no matter what type
cast you stick in front of the function call. IMHO, writing:

(void)printf("foo");

is completely useless and any self respecting compiler can very
well do without it and it saves you some keystrokes ... smile




--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Дрон
Дата 30.8.2005, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Это всё проясняет.
Что-то я и не подумал, что function f() was already compiled, т.е. она не может знать, что там подразумевает caller о её возвращаемом значении.

Следовательно, такая запись -- просто заблуждение? smile

Это сообщение отредактировал(а) Дрон - 30.8.2005, 15:56


--------------------
Да. Именно так.
PM   Вверх
Mayk
Дата 30.8.2005, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



srd
Гды вычитал?


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0884 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.