![]() |
|
|
![]()
|
|
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: нет Всего: 135 |
Здравствуйте.
Имеется такой код:
А теперь самое интересное: в gcc 4.1.2 это не линкуется - http://codepad.org/LB1506hR в gcc 4.3.2 линкуется - http://ideone.com/q1Uik8 в gcc 4.5.2 опять не линкуется - это уже на моей машине. ссылку дать не могу. в gcc 4.7.2 снова линкуется - http://ideone.com/rP6zIF Вопрос: ошибка у меня и необходимо добавить
или ошибка в компиляторах, в которых не линкуется ? И вообще, что за чехарда с компиляторами (вернее с версиями) ? Или м.б. это какая-то настройка (на ideoone она включена, а у меня и на codepad нет) ? Если да, то какая ? Спасибо. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
Вы уверены в версии? (возможно еще разные версии выходили параллельно (?не знаю), то есть возможно еще год релиза нужно смотреть) В шестой студии тоже нельзя было инициализировать стат.константы в классе. В поздних версиях уже можно. Почему? Видимо в силу тумнности выражений стандарта С++, создатели компиляторов не вкурили его достаточно глубоко. Посему старые версии такое не переваривают. Новые же версии, (даже с ключами например -std=c++98), переваривают нормально.
|
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: нет Всего: 135 |
> Вы уверены в версии?
Да, вроде. Вызывал g++ -v и он выдал 4.5.2. По поводу года не скажу. Он был в поставке с Ubuntu 11.04. Интересно то, что ошибка линковки возникает только если брать адрес (сылку) этой переменной (в моём случае это std::min). Если же использовать только как rvalue, то ошибки нет. Я, всё-таки, склоняюсь к мнению, что тут дело в настройках компилятора... -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
||||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
||||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
borisbn, Да я понимаю ваше молчание...
Действительно, с какого это перепуга, правильность кода (компилируемость) зависит от введения/невведения оптимизации. Код либо правильный, либо нет. Оптимизация на это не должна никак влиять. Очень похоже на баг gcc. (Хотя логически понять причины такого поведения можно) Вот максимально-сокращенный код который не компилируецца у меня на gcc 4.7.0 ни при каких оптимизациях. Но кстати, прекрасно компилицца на студии.
Приглашаюцца к обуждению опытные gcc-шники, зубры-линуксоиды, а также вообще знатоки приплюснутых стандартов. Велкам... |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: нет Всего: 135 |
volatile, не.. я не по этому молчал. Вы попросили посмотреть параметры компиляции на моей машине, а её у меня на время забрали.
А по поводу оптимизации - вроде в online-компиляторах она выключена... И да.. не должна она влиять. Единственное - м.б. есть какая-то опция, влияющая на такое поведение ?
Поддерживаю. Ждёмс. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
Это сообщение отредактировал(а) mes - 9.6.2013, 12:49 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
mes, ваша цитата мимо кассы. здесь говорицца для случая когда нет инициализации в описании класса. (Кстати в этом случае и студия компилировать не будет) И потом, давайте оставим студию, раз вас так она раздражает. Сам факт что компилируемость кода зависит от оптимизации, уже достаточно стрёмен, не находите ? Это сообщение отредактировал(а) volatile - 9.6.2013, 23:26 |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
как по мне, так тут как раз таки грицца о случае, когда она есть при декларации внутри класса, и ее отсутвии вне класса..
да, это баг.. приведенный последний пример не должен компи линковаться ни при каких оптимизациях.. за исключением случая, когда факт использования взятия адреса с'оптимизирован ни капли не раздражает, просто у них свой взгляд на вещи и ориентироваться по ней на стандартность поведения "рискованно" Это сообщение отредактировал(а) mes - 13.6.2013, 19:48 |
||||
|
|||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
||||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
Да и кстати, в окончательном варианте стандарта 2011, вашей цитаты, вообще нет (по крайне мере в данном пункте, и ближайших окрестностях). Дальше идёт про другое... Так что спорить о переводе не известно откуда взятой фразы, не имеет смысла. Добавлено @ 00:27 ![]() Это сообщение отредактировал(а) volatile - 14.6.2013, 00:38 |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
ну так с более 10ка лет был актуален другой стандарт, в котором эта фраза была актуальна.. ну и ?? обратили внимание на constexpr specifier ? и гдепродолжение цитаты, которое описывает приведенный Вами случай ? пару строчек ниже :
Добавлено @ 01:02 если внимательно прочитали цитату, то
в общем случае сомнительно считать багом, если линкуется потому, что оптимизатор выкинул ненужные связи.. Это сообщение отредактировал(а) mes - 14.6.2013, 01:04 |
||||||
|
|||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
mes, Ну хорошо, давайте предположим на миг что ваша трактовка верна, В вашей цитате ведь говорицца вообще о "статической константе" как таковой. Там нет ни слова ни о взятии адреса, ни о чем либо подобном. Что означает (если трактовать по вашему), абсолютно правильный компилятор вообще не должен принимать статическую константу, без отдельного определения ее где-то в *.cpp Не только взятие адреса (о котором, повторяю нет ни слова), но и именно саму константу! Именно так ваша трактовка и звучит. Не больше и не меньше. Но gcc, вашей трактовке не соответствует, даже с ключом -pedantic. (тестовый код элементарен, не привожу) Более того, вашей трактовке, не соответствует ни один известный мне компилятор. Так что смысла продолжать дисскуссию не вижу. |
|||
|
||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
давайте хоть на миг )
не совсем, в середине цитате говорится еще об использовании константного выражения ассоциированного с константой
нет, Вы не правильно трактуете мою трактовку.. так упустили то самое предложение из середины цитаты.. и не обратили почему же стоит "still" и "if" в последнем предложении, которые явно намекают, что должна быть еще одна ситуация..
о взятии ни слова, но есть слова об использовании константы и использовании константного выражения... Акцент на взятии адреса был потому, что подобное использование никак нельзя отнести к константому выражению.. именно так Вы хотите ее воспринимать.. не моей )) так действительно, чего продолжать если подменяете сказанное своими ожиданиями услышанного.. |
||||||||
|
|||||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
Намекают - сильно сказано! Не сомневаюсь что с вашей выдающейся способностью к софистике и из туманных намеков в купе с "still" и "if" можно вывести все что угодно... Это сообщение отредактировал(а) volatile - 16.6.2013, 00:03 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
иногда достаточно просто перечитать заново и вникнуть в пропущенное при первом чтении Добавлено через 2 минуты и 58 секунд ладно, чтоб не уходить в переспоривание озвучу свою трактовку с коментариями.. |
|||
|
||||
| mes |
|
||||||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
в старом с++ не было constexpr, хотя само константное выражение (как понятие) было. Чтоб получить большую эффективность, пользователю позволяется ассоцировать интегральную константу с константным выражением. После чего, при употреблении в выражениях ожидающих константное выражение, оно подставляется вместо самой константы.. Самый простой пример
В этом случае константа не участвует в процессе, она лишь служит переносчиком константного выражения.. Теперь подойдем к классу и нашей цитате..
ну тут понятно без пояснений
ее объявление (именно объявление, не определение) может быть специфицировано констным выражением. "Объявление" нам говорит, что объект (в памяти) не определен.
В этом случае дата-член может появляться в константном выражении.. Как раз об этом говорилось в начале поста..Не забывайте, что объект (lvalue в терминах c++) пока не определен.
дата-член должен быть к тому же определен вне класса, если используется в программе. Вот тут наконец то определяем сам объект.. И обратите внимание в первом случае было "появляeтся" (can appeаr), а теперь "используется" (used), потому как в первом случае у нас имелась только декларация, и использования объекта не было..
ну тут опять без фокусов, если указали инициализатор при декларации в классе, то при определении вне класса он должен отсутствовать.. Ну вроде и все.. Это сообщение отредактировал(а) mes - 16.6.2013, 10:58 |
||||||||||||
|
|||||||||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
||||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
Мес, не обижайтесь, не стоило здесь приводить это все. (хотя еще раз спасибо).
Да я прекрасно понял что вы хотите сказать. Я и без того, разделяю ваше мнение насчет подстановки констант. Еще в начале: Беда только в том что все это являецца лишь логическим выводом. И бездоказательно, к сожалению. |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
Bjarne Stroustrup - ему можно верить ? The C++ Programming Language (Third Edition)
Добавлено @ 13:09 в его ж d&e тоже вроде было на эту тему..
хотя да, опять догадки.. никаких выводов Это сообщение отредактировал(а) mes - 16.6.2013, 16:16 |
||||
|
|||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
borisbn, насколько удалось выяснить в codepad.org например, она включена.
Почему в таком случае, он выдает ошибку, (а 4.7.0 абсолютно при тех-же ключах не выдает) остаецца только гадать... Впрочем не сомневаюсь что mes, опираясь на пару, тройку "still" и "if" в стандарте, выведет "основательное доказательство" и этому факту. Это сообщение отредактировал(а) volatile - 16.6.2013, 23:54 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
||||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: нет Всего: 85 |
mes, я тут на досуге почесал репу, и понял что мне мешает воспринимать ваши доводы.
Важный вопрос (для меня). У меня есть убежденность, как должен звучать правильный ответ. Но сие убеждение, основано какбы э.... на вере в некую "космическую гармонию" =) Но возможно "гармонию" я придумал, и на самом деле ее нет. И так: Рассмотрим некий абстрактный идеальный случай: одна машина, одна операционка, одинаковое окружение, одни и теже библиотеки и т.д. и т.д. один С++ код, без "undefined behavior" и "implementation defined" И есть два разных, строго_соответствующих_стандарту С++ компилятора. (само собой без багов) Утверждение: Удачная компиляция+сборка на одном компиляторе не дает никаких гарантий, что на другом компиляторе этот же код будет компилироваться+собираться. Вопрос: Справедливо ли по вашему это утверждение? пожалуйста, ДА или НЕТ ? (Без каких-то дополнительных условий. Вопрос звучит так, как он звучит.) Добавлено через 34 секунды Или может голосование устрить? но прежде всего, я хотел бы услышать ваше мнение. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
да, если код ill-formed нет, если код well-formed и компиляторы соответствуют стандарту.. да + нет -> ДА Это сообщение отредактировал(а) mes - 23.6.2013, 21:15 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
volatile, я тут на досуге почесал репу, и понял что вам мешает воспринимать мои доводы
утверждение малость вывернуто наизнанку.. удачная компиляция+сборка вообще никаких гарантий не дает. гарантии может дать только строгое соответствие кода и компилятора общему стандарту.. для того стандарты и придуманы.. только вот некоторые стандарты несколько расплывчаты, чтоб развязать руки производителям компиляторов, в итоге сложность соблюдения соответствия увеличивается.. плюс некоторым хочется понравится пользователю и они предлагают собственные расширения, иногда противоретящие основным правилам.. но в итоге: только well-formed код с одной стороны, и соответствующий этим правилам (не обязательно основному стандарту) компилятор с другой стороны могут гарантировать успешность предприятия Это сообщение отредактировал(а) mes - 27.6.2013, 21:03 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | GNU toolchain | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |