![]() |
|
![]() ![]() ![]() |
|
Bodro |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 27.1.2006 Где: Россия, г. Рязань Репутация: 2 Всего: 4 |
Парни - больше пишите программ и изучайте язык, чтобы понимать такие "дурацкие конструкции" и не удивляться им. Если у вас недостаточный опыт работы с языками, компиляторами и разными платформами, то не надо это выставлять напоказ - лучше скрывать это, а то выглядит очень некрасиво. Больше похоже на болтовню, нежели на профессионализм. volatile хотя б ссылку на стандарт привёл.
Если вы не видели ничего кроме Builder, Visual Studio и Windows, то лучше бы не вмешивались в те вещи, которые не понимаете. Любая критика должна быть обоснована. А вы просто плюнули пост, засрали и всё! И ни доказательств, ни примеров "более правильной", по вашему мнению, реализации. Ничего - пустота и болтовня! К тому же я от вас, кроме засирания, пока не увидел ни одной строчки кода (ни от одного ни от другого). В первых постах люди писали код, затем я написал кроссплатформенный абсолютно рабочий код - большое количество примеров. А от вас, кроме бестолковой критики, ничего не последовало. Хотите поболтать - пишите мне в личку - форум не надо засорять мусором и флеймом. В личке, если хотите и если у меня будет время на вас, я покажу код, реально используемый в ядре Linux, в оборудовании CISCO, в браузере Oregan, в ядре операционной системы STM OS20, в некоторых "хакерских" утилитах и бэкдорах, а так же в некоторых прикладных программах, реально используемых на платформах Linux и Windows. Вы, ребята, похоже что, тролли или холиварщики. Напиши парочку примерчиков и представь их, а троллить - много ума не надо! Надоела мне вся эта чушь! Код не пишите, а только тролите! Желаю удачи! Модератор, да закрой ты тему! А то начнётся сейчас тут война. Парень (Dreamuchiy) уже получил огромное количество ответов на вопрос. Думаю, он и сам за 4 года уже нашёл ответ на свой вопрос. |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 3 Всего: 85 |
||||
|
||||
alexvs11 |
|
|||
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: нет Всего: 10 |
||||
|
||||
Bodro |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 27.1.2006 Где: Россия, г. Рязань Репутация: 2 Всего: 4 |
С этого-то и начался спор - я же писал про это и мой код с такими вот подавлениями как раз и был (см. выше). Я же всё это писал уже и подробно объяснял. Перечитайте мои посты в этом топике. Есть компиляторы, которые не любят подобное подавление и ругаются на него при определённых опциях. Собственно, про это я тоже писал несколько постов раньше. Ладно, может просто кто не понимает суть подавляющей функции. Объясню. В стандарте C99 и в C++ есть так называемые встраиваемые функции - ключевое слово inline. Код данной функции подставляется непосредственно в место вызова (это все знают - просто напоминаю). Таким образом, код функции
подставится в место её вызова, а, поскольку, она пустая, то ничего подставляться не будет. Таким образом, она никаким образом результирующий код не изменит, но позволит компилятору понять, что мы значение, которые передаём ей, собираемся использовать. Можно использовать template для подавления любых типов, а не конкретно int (только C++). Внутри переменную unused можно давить средствами прагм, обычным (void) и т.п. Но давить придётся в одном месте, а не в тысячи. Даже если ваш компилятор выкинет ворнинг, он его выкинет только в одном месте и для данного компилятора конкретно это место можно заглушить прагмами. Вариаций написания подобных функций много - проявите фантазию. Я представил лишь пример, отражающий саму суть. Для тех кто по-прежнему продолжает считать что это "дурацкая конструкция" - пусть скажут это Trolltech и Nokia:
Простите за грубость, но учите матчасть! ![]() ![]() ![]() ![]() ![]() ![]() UPD Вот сюда ещё взгляните - ещё один интересный вариант подавления: http://www.boost.org/doc/libs/1_49_0/boost...port/unused.hpp Это сообщение отредактировал(а) Bodro - 27.6.2012, 15:28 |
||||
|
|||||
alexvs11 |
|
|||
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: нет Всего: 10 |
согласен, видимо в этом есть смысл просто учитывайт, что когда ты разговариваешь с собеседником как с ребенком (эти длинные телеги текста и рассказы про свой недюжий профессионализм), то ожидай такого же отношения и к себе |
|||
|
||||
Bodro |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 27.1.2006 Где: Россия, г. Рязань Репутация: 2 Всего: 4 |
Вообще-то, я просто написал программу и всё! Надо было просто её собрать и проверить работоспособность. Вместо этого люди стали показывать свой "профессионализм" и писать комментарии, ища в коде погрешности. На что и получили, собственно, телеги, где приходилось объяснять всё как ребёнку. Люди-то не спрашивали, а писал то что в коде они увидели "ошибки", а потом и вовсе дошло до "дурацких конструкций". Конструктивный диалог никто не вёл. Если что-то в моём коде показалось непонятным и странным - можно же было просто спросить? К чему все вот эти фразы?
Почему такого-же? Я не увидел в ответах рассказов про недюженый профессионализм, телеги кода, ссылок на примеры и подробных комментариев. Я объяснял всё тщательно и подробно, со стороны же оппонентов такого не было. Предлагаю закончить весь разговор миром. Если кого обидел - прошу прощения! Я серьёзно! Просто давайте как-то более вежлевее, терпеливее и профессиональнее относиться друг к другу. Это сообщение отредактировал(а) Bodro - 27.6.2012, 16:37 |
|||
|
||||
volatile |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 3 Всего: 85 |
Макрос Q_UNUSED позволяет избежать предупреждений по поводу неиспользования какой-то переменной (чаще всего аргументов). А вовсе не для функций возвращающих значение, которое мы не используем.
Да я встерчал в паре-другой проектов такие конструкции, и считаю это абсолютно ненужным загромождением кода. К тому же это непоследовательное решение. Раз уж идти этим параноидальным методом, то нужно идти до конца. И приводить к void, везде где не исползуется значение. А поскольку язык С/С++ состоит практически на 90% из выражений, то к (void) нужно приводить практически каждую строку. например:
Кстати, это абсолютно правильный, рабочий и кроссплатформенный код. ![]() но умный ли, это вопрос... Кроме того, ссылки на Trolltech и Nokia не совсем уместны (тем более в разделе дебилдера) Достаточно будет одной ссылки на стандарт. Буду признателен если вы укажете место, где говорится что приводить к (void) неиспользуемое значение функций - есть жизненная необходимость. |
||||||
|
|||||||
alexvs11 |
|
|||
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: нет Всего: 10 |
полагаю подразумеваются радикальные ключи компиляции, которые заставляют проверять возвращаемые значения |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 3 Всего: 85 |
Безусловно, есть такие ключи. Но их подобрать, нужно еще очень постараться. И это действительно радикальные ключи, используемые в особо параноидальных случаях. Это сообщение отредактировал(а) volatile - 28.6.2012, 00:40 |
|||
|
||||
Bodro |
|
||||||||||||||||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 27.1.2006 Где: Россия, г. Рязань Репутация: 2 Всего: 4 |
*** 1 - "ПАРАНОИДАЛЬНЫЕ КЛЮЧИ КОМПИЛЯЦИИ, КОТОРЫЕ НИКТО И НИКОГДА НЕ ИСПОЛЬЗУЕТ" ***
Информация об используемых компиляторах:
Код из libc:
Проверочный код:
Результат работы:
В строке $ gcc test.c -c -O3 есть что-то параноидальное, сложное или крайне-редко используемое? *** 2 - "САГА ОБ АБСОЛЮТНОМ ЗНАНИИ ЯЗЫКА СИ И C++ ИЛИ АБСОЛЮТНО ПРАВИЛЬНЫЙ, РАБОЧИЙ И КРОССПЛАТФОРМЕННЫЙ КОД" *** Вы тут где-то видите неиспользуемые переменные или возвращаемое функцией значение? Вы совсем не понимаете о чём мы говорим? *** 3 - МЫ УМНЕЕ ВСЕХ ИЛИ QT И BOOST ДЛЯ НАС НЕ АВТОРИТЕТ *** Очень странно что Boost и Qt для вас не являются авторитетом. Это библиотеки, которые используются во всём мире в огромном количестве программ и прекрасно себя зарекомендовали как мощнейшие кроссплатформенные библиотеки. Если вы их не считаете за хороший пример написания кода, то это как бы наводит на мысль о вашей квалификации. Qt и Boost отлично используются в Билдере. *** 4 - НАДО ЖЕ БЫЛО ВЫДУМАТЬ ТАКУЮ ДУРАЦКУЮ КОНСТРУКЦИЮ *** Информация о компиляторе Intel:
Тестируемый код:
Результат для компилятора Intel под Linux:
А вот gcc обрабатывает такие ситуации отлично (даже при всевозможных опциях предупреждений):
Как видим, одного лишь (void) бывает недостаточно. *** 5 - ВЕК ЖИВИ - ВЕК УЧИСЬ ИЛИ РАССКАЗ О ТОМ КАК Я СЛАЖАЛ *** На счёт функции подавления признаю - недолядел - представил не совсем универсальный способ. На самом деле всё гораздо строже. Данный механизм мы используем редко (в основном уже готовые макросы или функцию в том виде, в котром я её вам описал) от этого и недоглядел. Так вот - суть в ссылке, т.е. когда мы пишем (void) variable;, то некоторые компиляторы считают что мы пытаемся использовать неинициализированную переменную и ругаются на это (если переменная действительно неинициализировалась). Функция подавления в том виде, в котором я её описал первоначально, положительного результата в этом случае не даст, потому что мы в неё пытаемся передать значение неинициализированной переменной. Как раз тут-то и нужна ссылка! Таким образом компилятор будет понимать что, возможно, мы переменную проинициализируем внутри функции.
Это что касается C++. Теперь, если мы хотим написать код на Си и нам, возможно, придётся компилировать его на компиляторе C++. Т.е. нам нужно создать какой-то способ подавления предупреждений о неиспользуемых переменных как на компиляторах C, так и на компиляторах C++. Тут возникает некоторая загвоздка! Ссылок-то у нас нет, а конструкция с (void) не всегда работает (пример - учебный компилятор Comeau или, например, компилятор Intel - раз есть два, значит есть и другие). Тут придётся шаманить:
Вообще, выглядит страшно и совместимо только со стандартом C99 и C++, т.к. содержит inline. Скажем так, я не нашёл оптимального универсального способа глушить предупредения компилятора о неиспользуемых переменных. Есть способ, применяемый на компиляторах C++, есть способ (см.выше), применимый на компиляторах C99 и C++. Можно придумать способ и для C89, но он не очень хороший (вызов call и ret).
Ну и опять таки, придётся передавать не само значение переменной, а её адрес. Для тех, кто считает что я загоняюсь, хочу сказать, что реальные задачи именно такие - откройте GNU-код и увидите. Ещё примеры - протокол RTSP от CISCO, браузер Oregan от Oregan Networks, TCP/IP стек протоколов NexGen, код операционной системы STM OS20, ПО IPTV приставки IP-STB ICxSTB500-01, веб-интерфейс некоторых прошивок оборудования D-Link и др. Мне всегда хватало того что есть в Boost и Qt. Для более простых случаев я писал собственные глушилки или использовал (void), когда этого было достаточно. Но сейчас специально порылся и увидел, что всё-таки есть компиляторы, на которых даже тех вариантов, которые я представил (которые обосрал volatile и некоторые другие участники) оказывается недостаточно. В моей практике они не встречались. У всех, кто удивился моим конструкицям и способам глушения ворнингов хочу спросить - вы хоть пытались гуглить проблему??? Для себя я нашёл способы глушения, но, как я сегодня узнал, что даже такие варианты не всегда помогают. Прежде чем засрать - вы бы почитали хоть Интернет! *** 6 - ПО-СТАНДАРТУ, В ТУШЁНКЕ ДОЛЖНО БЫТЬ МЯСО *** Да причём тут стандарт??? Никому не интересен стандарт! Задача же не написать тупорыло код по стандарту, а задача сделать так чтобы он работал практически на любых компиляторах. Вот о чём разговор-то идёт. У каждого компилятора есть свои расширения, свои опции, свои особенности, свои ошибки в конце-концов! Какое нам дело до стандарта, если написанный нами код не собрался под используемый нами компилятор??? *** 7 - ВЕСЬ РАЗГОВОР НЕ ПО ТЕМЕ *** Да, спор наш и правда абсолютно не по теме. Тема конкретная - Билдер. Человек задал вопрос - я просто написал несколько примеров, которые в том числе работаю на Билдере. На этом можно было б остановиться, если бы не volatile, который решил показать что он не знает функции calloc, но зато точно знает как можно обосрать то, что он не сделал. Ну а дальше пошло-поехало. Я предлагал много раз закрыть тему, но каждый раз кто-то что-нибудь неприятное да напишет! В заключении хочу сказать. Я тут собрал всё в кучу и различные платформы и компиляторы, и языки С и C++. Много что. Но суть-то не в этом. Изначально я получил претензии в свой адрес что я написал очень неправильный, кривой, неработающий, праноидальный (и т.д.) код. И что я всё это выдаю за кроссплатформенность. Что в том что я написал нет никакой необходимости и это полный бред. Данный трактат написан для того, чтобы прочитав его и попробовав примеры, которые я указал, вы задумались, что стоит ли нападать на человека, который просто решил помочь другому и предложил несколько вариантов кода. Зачем нападать и тем более критиковать, когда у вас недостаточно опыта и знаний на критику? Господа, я призываю вас - впредь не нападайте ни на новичков ни на спецов - только себя выставляете в дурном свете! Прекратите же все свои нападки на мой код! Если есть что сказать, то сначала напишите хоть какие-нибудь примеры, касающиеся данного топика, а потом уже критикуйте (только очень прошу - подтверждайте свою критику фактами, стандартами, документацией, примерами кода, ссылками на авторитетные источники, личный опыт и т.п.). Обращаюсь к автору темы и к модератору - закройте тему! Холивар чистый воды! Прошу прощения, что я его поддерживаю, просто не люблю необоснованные нападки на меня. volatile, если вы не знаете, то зачем же пишете? Чего вы добиваетесь от этого спора? (ответ в личные сообщения) |
||||||||||||||||||||||||
|
|||||||||||||||||||||||||
alexvs11 |
|
||||
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: нет Всего: 10 |
фантастичное чтото есть, какая версия gcc?
|
||||
|
|||||
Bodro |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 27.1.2006 Где: Россия, г. Рязань Репутация: 2 Всего: 4 |
Я так понимаю, весь текст вы не читали.
Это сообщение отредактировал(а) Bodro - 29.6.2012, 17:38 |
|||
|
||||
Bodro |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 27.1.2006 Где: Россия, г. Рязань Репутация: 2 Всего: 4 |
А у вас что за версия libc и что за версия gcc? Или хотяб что за операционка?
Мне нужно: $ uname -a $ gcc --version $ ldd --version $ lsb_release -a Если что-то не заработает - скажите. UPD Кстати, функцию main могли бы не писать - мы ведь собираем с ключом -c. Правда, на предупреждение это никак не влияет вовсе. Это сообщение отредактировал(а) Bodro - 29.6.2012, 17:58 |
|||
|
||||
alexvs11 |
|
||||||
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: нет Всего: 10 |
у меня 4.3.4
опять же тут два очевидных решения: 1) писать нормальный код и честно проверять возвращаемое значение 2) использовать -Wunused-result, хотя лично на моей версии он даже такого ключа не знает
догадываюсь Добавлено через 2 минуты и 16 секунд
зачем такой код может быть нужен? Добавлено через 3 минуты и 18 секунд
это к предыдущему вопросу |
||||||
|
|||||||
Bodro |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 27.1.2006 Где: Россия, г. Рязань Репутация: 2 Всего: 4 |
Ну тогда уж не -Wunused-result, а наоборот: -Wno-unused-result. -Wunused-result указан по-умолчанию.
А на счёт нормального кода - согласен - проверять возвращаемое значение нужно, но согласитесь, вы же не всегда его проверяете и не всегда оно вам действительно нужно. Порой возвращаемое значение можно проигнорировать. Но при переносе на другую платформу могут возникнуть ненужные ворнинги, а если, в случае с gcc, вы так же укажите -Werror, то код просто не соберётся. Так что, как сами видите, однозначностей тут нет. Я надеюсь, вы то хоть со мной согласитесь? Кстати, вы посмотрите на stdio.h на функцию fread. У неё в конце указано что-то вроде __wur или __attribute_warn_unused_result__? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |