Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / C++ |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Сибирский Пушистый Member Откуда: б.о.м.ж и з Сообщений: 20 |
Что это макрос, после которого можно ставить точку с запятой, понимаю даже я. Но какое отношение всё это имеет к блокировке и что вообще достигает этот код из драйвера VDFS для линукс? lockdep.h:
#define lockdep_assert_held(l) do { (void)(l); } while (0)
vdfs4.h: lockdep_assert_held(&inode->i_mutex); |
3 фев 21, 21:35 [22274356] Ответить | Цитировать Сообщить модератору |
a guest Member Откуда: Сообщений: 326 |
|
||||
3 фев 21, 21:47 [22274361] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 51017 |
После макро-процессинга будет нечто вродеdo { (void)(&inode->i_mutex); } while (0); |
3 фев 21, 22:00 [22274372] Ответить | Цитировать Сообщить модератору |
Сибирский Пушистый Member Откуда: б.о.м.ж и з Сообщений: 20 |
mayton, У меня, конечно же, и близко нет 300 айкю, и человек я простой: когда пишу код, то он выполняет какую-то функцию. Но какую функцию выполняет ЭТО? Оно же вообще ничего не делает. Или я ошибаюсь? |
4 фев 21, 00:08 [22274409] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Во первых, на сайте www.kernel.org лежат исходники. И там прокомментирован этот макрос. Я попробовал разобраться, но не очень понял о чём они пишут. Но это не код, который что-то должен делать. Это какой-то костыль, который что-то должен проверять. Например, то что у типа структуры "inode" есть поле данных "i_mutex". Иначе оно не будет компилироваться. Зачем это нужно? ХЗ. do { (void)(&inode->i_mutex); } while (0); Зачем тут цикл тоже не понятно. Похоже на какой-то грязный хак, когда люди знают как работает компилятор и пытаются его обмануть зачем-то. И я не понимаю, почему указатель на некую переменную может приводиться к void. Не к void*, а к void! Хотя где-то я видел такое. |
||||
4 фев 21, 00:33 [22274415] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Специально ничего не делающим этот макрос выглядел бы так:
#define lockdep_assert_held(l)
|
||||||||
4 фев 21, 00:36 [22274418] Ответить | Цитировать Сообщить модератору |
a guest Member Откуда: Сообщений: 326 |
Сообщение было отредактировано: 4 фев 21, 10:32 |
||||
4 фев 21, 01:09 [22274424] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
PS: Тебе нужно нам пояснить, почему при таких параметрах условной компиляции этот макрос выглядит именно так:
#define lockdep_assert_held(l) do { (void)(l); } while (0)
Зачем тут цикл, зачем приведение к void и т.д. Сообщение было отредактировано: 4 фев 21, 10:32 |
||||
4 фев 21, 01:21 [22274425] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Весь остальной букварь грязных Си-трюков тоже процитировать, начиная с "a=b=c=0" и "++p*=*q++"?.. Posted via ActualForum NNTP Server 1.5 |
||
4 фев 21, 01:49 [22274428] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Приведённое тобой — это не грязные трюки. Это штатный и очевидный функционал Си. Осталось сверится с таблицей приоритетов операторов. На мои вопросы тебе есть что ответить? |
||||||
4 фев 21, 01:55 [22274430] Ответить | Цитировать Сообщить модератору |
a guest Member Откуда: Сообщений: 326 |
Сообщение было отредактировано: 4 фев 21, 01:51 |
||||||||
4 фев 21, 01:58 [22274432] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Твои вопросы - тоже штатный и очевидный функционал макросов. Параметр используется чтобы компилятор не пропустил инвалидное выражение в нём. Он используется в круглых скобках чтобы обойти грабли с нетривиальными выражениями (гугли "зачем скобки вокруг параметров в макросе"). Он приводится к void чтобы подавить предупреждение о неиспользуемом результате. Он в цикле чтобы обойти грабли взаимодействия с if без кривых скобок (опять гугли "зачем фиктивный цикл в макросах"). Posted via ActualForum NNTP Server 1.5 |
||
4 фев 21, 02:01 [22274433] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Объясни, плиз, зачем это (такой цикл) пишут в сишных макросах? И зачем приведение к `void`? Пожалуйста. |
||||||||
4 фев 21, 02:05 [22274434] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 51017 |
Мемберов не обсуждаем! |
4 фев 21, 10:40 [22274508] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Спасибо, этого не знал. В Студии такого преобразования не требуется. По крайней на третьем уровне варнингов.
Да, и это в новинку. Но такой фиктивный цикл используется что бы обрамлять несколько выражений разделённых точкой с запятой. Я так вижу что тут это излишне. |
||||||||
4 фев 21, 11:29 [22274544] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
То, что конкретно в этом макросе такое не случится, ещё не повод для него нарушать правила написания безопасных макросов. Posted via ActualForum NNTP Server 1.5 |
||
4 фев 21, 13:40 [22274676] Ответить | Цитировать Сообщить модератору |
a guest Member Откуда: Сообщений: 326 |
Сообщение было отредактировано: 4 фев 21, 14:31 |
||||
4 фев 21, 14:38 [22274737] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Короче, макросы — зло. |
4 фев 21, 15:01 [22274768] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Для тех, кому Си и С++ слишком сложны - были созданы Ява и С-шарп. Posted via ActualForum NNTP Server 1.5 |
4 фев 21, 15:06 [22274775] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 51017 |
Ну... это тоже есть. ![]() |
||||
4 фев 21, 15:15 [22274787] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Подмена понятий. :) Страуструп тоже считает макросы злом. |
||||
4 фев 21, 15:41 [22274832] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Инструмент не по делу применён. Кстати, забавно. Поскольку речь явно идёт о блокировках и мьютексах, то зачем макрос, который при данных настройках компилятора, ничего не делает? Они код собирают в однопоточном или многопоточном режиме? Наверное, да. |
||||||||
4 фев 21, 15:44 [22274836] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Ну так поищи другие определения этого макроса и посмотри при каких условиях они используются. PS: А Страуструп придумал макросы 2.0 - темплейты. Естественно, первую версию он будет считать злом. Сообщение было отредактировано: 4 фев 21, 15:47 |
4 фев 21, 15:53 [22274845] Ответить | Цитировать Сообщить модератору |
White Owl Member Откуда: Сообщений: 12682 |
|
||||
4 фев 21, 16:24 [22274893] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Я в линуксе разбираться не хочу. Может нам mayton поможет? Зачем этот макрос? |
||||
4 фев 21, 17:02 [22274925] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / C++ | ![]() |