Jump to content

    

Косяк у Кейла

Увы, это совершеная реальность - ПЕРЕД компиляцией сишный исходник проходит через препроцессор. Удивлен немало, что это для Вас новость :(.

Вы будете смеяться, но перед вёрсткой текст книги проходит корректора, редактора и кого-то там ещё, наверное. И вы утверждаете, что редактор не может посмотреть на то, на что смотрит корректор? Пардон, но какую траву вы курите? Исходный текст злобные чекисты спрятали что ли? Я вас умоляю... :twak:

Share this post


Link to post
Share on other sites
Пардон, но какую траву вы курите? Исходный текст злобные чекисты спрятали что ли? Я вас умоляю... :twak:

От того, что Вы будете повторять дурь находящуюся в Вашей голове, Ваши фантазии о том, как должен работать препроцессор + компилятор ничего не изменят.

 

 

Share this post


Link to post
Share on other sites
От того, что Вы будете повторять дурь находящуюся в Вашей голове, Ваши фантазии о том, как должен работать препроцессор + компилятор ничего не изменят.

Мне более не интересно пытаться донести свою мысль до вас. Адью.

Share this post


Link to post
Share on other sites
в конструкции:

r = (a * b) + (c * d);

тоже есть "лишние конструкции", которые транслятор "выкинет". Например, скобки вообще "лишние". Да и пробелы совсем не нужны. Может программист "все-же рассчитывал этими скобками на какой-то другой эффект"?

Вы, очевидно не поверите, но компилятор скобки не "выкинет", он выполнит НЕ РАСУЖДАЯ предписанные ими действия. С пробелами еще проще - их игнорирование описано стандартом, так-что компилятор де-юре не думает, что кто хотел сказать пробелами.

P.S. Модераторам: из топика имеет смысл обсуждение конструкции do-while-zero вынести в отдельную тему.

Уже была когда-то. Вторая никчему.

Share this post


Link to post
Share on other sites
Вы, очевидно не поверите,

Очевидно, тут не вопрос веры.

но компилятор скобки не "выкинет", он выполнит НЕ РАССУЖДАЯ предписанные ими действия. С пробелами еще проще - их игнорирование описано стандартом, так-что компилятор де-юре не думает, что кто хотел сказать пробелами.

Сказали "А", говорите и "Б". Если "лишние" пробельные символы компилятор может удалять(игнорировать) без предупреждений, то и валидные конструкции "while(0)", "for(;;)", "#if 0", по той-же самой логике транслятор должен обрабатывать согласно стандарту "НЕ РАССУЖДАЯ".

Что бы не уводить обсуждение в сторону прошу подкрепить или опровергнуть Ваше заявление

...Да и сам трюк, увы, грязноват, ибо while(константа) принципиально ошибочное выражение, хотя из-за его распространенности...

Откуда вы это взяли? Есть какой-то стандарт где это описано? Отраслевые инструкции? Исследования? В книжке какой-то прочитали? Бложик? Твиттер? Сплетни? С удовольствием ознакомлюсь с источником такой информации.

 

Share this post


Link to post
Share on other sites
Откуда вы это взяли? Есть какой-то стандарт где это описано?

Стандарт языка Cи, надо читать и ПОНИМАТЬ написанное. for( ; ; ) абсолютно ОДНОЗНАЧНОЕ указание компилятору сгенерировать цикл БЕЗ проверки каких либо условий. Любой другой вариант уже требует проверки, а для выкидывания ненужной проверки уже наличия минимальной, но оптимизации. Начинать думать можете начать с того, что в в примерах стандарта вечный цикл for( ; ; ) и нет ни одного while( CONST ) у K&R совершенно аналогично. Ни то ни другое не есть -

Бложик? Твиттер? Сплетни?

С удовольствием ознакомлюсь с источником такой информации.

Знакомьтесь.

Share this post


Link to post
Share on other sites
у K&R совершенно аналогично.

Это вообще странный авторитет, особенно в свете последней выдержки с преобразованием типов....

 

Стандарт языка Cи, надо читать и ПОНИМАТЬ написанное.

Надо, и в нем нет запрета на конcтрукцию while(0) и while(1), ровно как и нет неоднозначного толкования как она будет выполнена.

 

Ошибкой является утверждение что это "принципиально ошибочное" выражение, оно даже потенциально не ошибочное, не то что принципиально....

 

Нужно только помнить, что константы все равно по умолчанию интерпретируются как double, т.е. 1.234 - это double, а 1.234F - float.
Это понятно, и наличие этой константы в виде дабла по стандарту затянет все выражение в расчет в даблах. Но все же можно вести счет во флотах и это принципиально важно, это же ускорение за счет аппаратных модулей.... и по мне вот это гораздо важнее того как сделан вечный цикл через for(;;) или через while(1)

Share this post


Link to post
Share on other sites

Что вы сцепились на пустом. Я вот ни разу не использовал do { } while (0), и ничего. Программы работают, как задумано.

Share this post


Link to post
Share on other sites

ща и вам достанется:).... как вы могли ни разу не использовать?!!!

Share this post


Link to post
Share on other sites
ща и вам достанется:).... как вы могли ни разу не использовать?!!!

Ничего, с меня не убудет. Я авторитетом себя не считаю. Просто стараюсь писать аккуратно, не упуская нужных символов и не лепя ненужных. Пробелы не в счет, на них не экономлю. Например, если мне надо 1 << 7 + 16, то так и пишу. Хотя компилятор ругается предупреждением (не компилятор, а сама среда в Кейле значок ставит).

 

А VALUE я, пожалуй, в скобки возьму. Вдруг захочется мне (или кому-то другому) задать задержку в виде DELAY(2 + 2, _MS).

Share this post


Link to post
Share on other sites
Надо, и в нем нет запрета на конcтрукцию while(0) и while(1), ровно как и нет неоднозначного толкования как она будет выполнена.

Уже писал - в стандарте нет запрета на использование русских матерных слов, тем неменее компиляторы не захотят компилировать такие выражения. Точно так-же, как компиляторы, пусть даже и не все, таки выдают предупреждения на while( CONST ). Так-что давайте Вы свой талант толкователя стандартов будете демонстрировать не мне.

 

 

Share this post


Link to post
Share on other sites
Уже писал - в стандарте нет запрета на использование русских матерных слов

ну как же нет? Есть стандарт формирования имен переменных и список ключевых слов. Ваши матерные выражения не попадают в множество которые возможно создать по данным правилам, потому их и нельзя использовать....

 

Так-что давайте Вы свой талант толкователя стандартов будете демонстрировать не мне.

А вы не читайте....

 

Хотя компилятор ругается предупреждением (не компилятор, а сама среда в Кейле значок ставит).

а что за значок?

Share this post


Link to post
Share on other sites
а что за значок?

Восклицательный знак в желтом треугольнике напротив опасной строки. :rolleyes: И подчеркивает красненьким опасное место.

При наведении мыши на подчеркнутое или на значок выдается:

warning: operator '<<' has lower precedence than '+'; '+' will be evaluated first

Share this post


Link to post
Share on other sites
Но когда компилятор видит, что в результате выражения ЕМУ ПЕРЕДАННОГО получается константа, это однозначно тревожный факт указывающий, как минимум на потенциальную ошибку программиста.

Какую ошибку? Условие/выражение может быть опционально вычисляемое в рунтайме. Или в какой-то опции проекта вычисляемое на этапе компиляции. Но место проверки условия задаёт тип цикла и его устанавливает программер исходя из оптимальности алгоритма, в том числе опционального удобства.

 

Подозревать препроцессор в перетрахе только выражений - мало. Это текстовый препроцессор и он может заменять любое место исходника. for (;;) мог быть перед препроцессором for (A;B;C) где A, B, C дефайном задавались пустыми или не пустыми. Потенциальность ошибки зацитированным методом компилятору не определить.

 

----

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

У zltigo могло бы быть большое будущее во главе какого-нибудь ЦБ, ну или будучи физиком-теоретиком. Умеет фундаментализировать инфляцию. Инфляцию отсутствия ошибок через повышение интеллекта компилятора. А так же переориентируя точку отсчёта на прокладку препроцессор.

Edited by GetSmart

Share this post


Link to post
Share on other sites
вообще то, насколько я помню трюк

do

while(0)

создан для того чтобы в теле можно было в любой момент поставить break или continue и вывалиться из цикла, то есть закончить....

Да ну! Вообще-то дело обстоит с точностью до наоборот.

1) break это выход из ЛЮБОГО цикла и городить для этого while(0) совершенно незачем.

2) именно ИСПОЛЬЗОВАНИЕ do while(0) в обертке макроса приводит в ПОБОЧНОМУ эффекту выхода по break из макроса ну СОВСЕМ не туда.

 

 

Какую ошибку?

Ошибку того, что программист получил не то, что он думал. Ибо компилятор получил в качестве инструкции БЕССМЫСЛЕННОЕ, хотя и однозначное выражение. Дальше у компилятора два варианта - решить, что это написал не программист а "Джамшут" и не пытаться от него чего-либо еще добиваться, либо таки сообщить о подозрительном выражении.

Для определения "Джамшут"/программист у хороших компиляторов есть опция соответствующего warnig.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this