Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.
VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).
Borland 6.0 (среда, номера его компилера не помню) — тоже, т.к. плохо работает с шаблонами и странно наследует статические члены.
Может в Линух податься? Там есть хорошие среды разработки?
Здравствуйте Poudy, Вы писали:
P>Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.
Comeau C++
P>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).
Здравствуйте Poudy, Вы писали:
P>Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.
P>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).
P>Borland 6.0 (среда, номера его компилера не помню) — тоже, т.к. плохо работает с шаблонами и странно наследует статические члены.
P>Может в Линух податься? Там есть хорошие среды разработки?
Попробуй Intel Compiler 6.0, он поближе.
+ на некоторых задачах выигрыш по производительности до 100%
+ лучше работает с шаблонами
+ его понимет MS линкер
+ встаивется в Visual Studio
-/+ понимает большинство MS specific и MS несоответсвий стандарту
// типа for( int i =0 ; i < 100 ; i++ ){ }
// int i — ошибка
— из-за предыдущего о полном соотв. станд не может быть и речи
— есть свои глюки
— компилит раза в два дольше
P.S Можно скачать с сайта Intel-a, в где-то Inet-e есть кряка
Здравствуйте Poudy, Вы писали:
P>Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.
P>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).
Этого тебе ни один компилятор не позволит (по крайней мере стандартом это запрещено).
P>Borland 6.0 (среда, номера его компилера не помню) — тоже, т.к. плохо работает с шаблонами и странно наследует статические члены.
А можно подробнее про статические члены?
P>Может в Линух податься? Там есть хорошие среды разработки?
Там хорошо, где нас нет...
Здравствуйте Kaa, Вы писали:
P>>Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.
Софта без ошибок не бывает
Kaa>Comeau C++
P>>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).
Kaa>Это ошибка? Интересно. С каких пор?
С сентября 1998 года, если не ошибаюсь. Пункт стандарта 10.3.5
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Bell, Вы писали:
P>>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний). B>Этого тебе ни один компилятор не позволит (по крайней мере стандартом это запрещено).
Неправда, это называется ковариантные возвращаемые типы, стандарт описывает это в пункте 10.3.5:
The return type of an overriding function shall be either identical
to the return type of the overridden function or covariant with the
classes of the functions. If a function D::f overrides a function B::f,
the return types of the functions are covariant if they satisfy the
following criteria:
— both are pointers to classes or references to classes
— the class in the return type of B::f is the same class
as the class in the return type of D::f or, is an unambiguous
direct or indirect base class of the class in the return type
of D::f and is accessible in D
— both pointers or references have the same cv-qualification and the
class type in the return type of D::f has the same cv-qualification
as or less cv-qualification than the class type in the return type of B::f.
Здравствуйте Poudy, Вы писали:
P>Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.
Ну, как известно, совсем без ошибок нетривиальных программ не бывает...
P>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).
В этом отношении, а также в некоторых других, VC7.0 ближе к стандарту, но все еще не поддерживает частичную специализацию шаблонов классов, частичное упорядочение шаблонов функций, разрешение имен в зависимости от аргументов (Keonig lookup).
Можешь также попробовать Intel C++ Compiler. В некоторых отношениях поближе к стандарту, чем MSVC++. Кроме того, очень неплохо оптимизирует, прозрачно встраивается в Visual Studio, бинарно совместим с MSVC++.
P>Может в Линух податься? Там есть хорошие среды разработки?
(Почти) все, что есть в Linux, есть и в Windows (www.cygwin.org (?), www.mingw.org), но меня gcc особо не впечатлил: слабая по сравнению с VC++ 7.0 или Intel C++ оптимизация, медленная по сравнению с VC++ 7.0 скорость компиляции, имеющиеся среды — imho — сильно уступают Visual Studio.
Попробуй Comeau C++ (www.comeaucomputing.com) — основан на самом близком на сегодня к стандарту EDG front-end версии 3.0, стоит всего $43.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте Poudy, Вы писали:
P>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).
Этот компилер действует в данном случае строго в соответсвии со стандартом С++. Да и вообще из тех каккие видел VC самый продвинутый и имеет самую лучшую среду разработчика. (Убью, кто не согласен).
Здравствуйте Raul, Вы писали:
R>Здравствуйте Poudy, Вы писали:
P>>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).
R>Этот компилер действует в данном случае строго в соответсвии со стандартом С++. Да и вообще из тех каккие видел VC самый продвинутый и имеет самую лучшую среду разработчика. (Убью, кто не согласен).
Товарищ, Вы комментарии читаете (См. выше комментарий Orangy), или у Вас свой стандарт (Судя по заявлениям, написанный фирмой Микрософт )?
Здравствуйте Raul, Вы писали:
P>>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).
R>Этот компилер действует в данном случае строго в соответсвии со стандартом С++. Да и вообще из тех каккие видел VC самый продвинутый и имеет самую лучшую среду разработчика. (Убью, кто не согласен).
Не согласен, убивай
Однако точку зрения стандарта на это дело я уже изложил, так что спорить просто бессмысленно до тех пор, пока ты не приведёшь что-либо более конкретное. У VC достаточно много проблем во взаимопонимании со стандартном. Разводить тут флейм по этому поводу не намерен, прочитай официальные заявления Microsoft, потом возмущайся http://support.microsoft.com/default.aspx?scid=KB;EN-US;q243451&
Здравствуйте Poudy, Вы писали:
P>Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.
Comeau C++ (платный), кстати, на сайте разработчиков этого компилятора
есть онлайновая компиляция (правда запустить программу не сможешь,
куски программы удобно проверять на соответствие стандартам.
Обычно, если Comeau C++ не заглатывает, то ошибка где то у тебя .
GCC (халява), лучше бери последную версию, сейчас, помоему это 3.2.
Здравствуйте Vsevolod V.Burkutsky, Вы писали:
VVB>Попробуй Intel Compiler 6.0, он поближе.
Уже пробовал. Intel не подходит по той же причине, что и VC6. А пока у меня нет Itanium'а , от Intel нет большой выгоды, т.к. ускорение достигается почти только на "сплошных", без ветвлений, участках кода. Он циклы разворачивает, только жаль, что опция эта ставится для всего файла — в десять раз все циклы, например.
P>>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).
Kaa>Это ошибка? Интересно. С каких пор?
уже тогда это было в драфте стандарта, насколько я помню.
Я, видимо, что-то пропустил. Не помню, чтоб я это где-то слышал ранее А может и слышал, но уж очень плотно забыл. Такие вот пироги. Истинно, век живи, век учись.
VC — отвратительный компилятор.
Я больше чем уверен, что для подавляющего числа задач и при правильном проектировании он подходит идеально, только от этого не легче.
Замена возвращающего значения при перегрузке виртуальных функций нужна при реализации расширяемой библиотеки потоков и контейнеров. Если абстрактный поток-ридитель (Parent) умеет работать с объектами вида А, причем его операторы << >> возвращают Parent&, а дочерний поток (Child) реализует также работу с объектами вида Б или просто объединяет двух шаблонных абстрактных Parent для А и Б, то станут невозможными записи вида:
Child << A << Б, т.к. Child << A вернет Parent&, а тот не умеет работать с Б.
Кроме того, VC часто путается при определении размеров объектов для классов, переданных как аргументы шаблона. И это, видимо, не связано с выравниванием (или связано косвенно, но выравнивание byte все равно не помогает).
Просто, например, в модуле Picture.cpp объект Picture p весит 20 байт, а в модуле Template.cpp в инстанцированном шаблоне TTemplate<class T> : TTemplate<Picture> этот самый Т будет весить, например, 17.
Со статическими членами коряво работает Borland. Статические члены-классы в шаблонном классе определить не получается. Точнее не получается вызвать конструктор в модуле .cpp при повторном определении. Работать можно только со ссылками, тогда в .cpp приходится определять глобальный объект и устанавливать на него статическую ссылку в шаблоне. Или еще вот: при дебаггинге все статические члены с одинаковым именем в родственных классах выглядят как один (один и тот же) объект. К счастью, в самом коде это не так.
А вот насчет $43 за ComeauС. Я о нем раньше не слышал. Обязательно схожу по ссылке. И тогда такой вопрос: есть ли для него IDE и нельзя ли достать сам компилятор бесплатно? Все стремятся к бесплатному. За хорошую работу я с удовольствием заплачу, а вот если все окажется рекламой, то будет обидно.
Здравствуйте Poudy, Вы писали:
P>VC — отвратительный компилятор. P>Я больше чем уверен, что для подавляющего числа задач и при правильном проектировании он подходит идеально, только от этого не легче.
Помимо соответствия стандарту надо еще учитывать другие факторы. У VC++ один из лучших на сегодня оптимизаторов, один из лучших показателей скорости компиляции, прекрасная среда, масса кода доступна для использования с VC++ и т.д.
P>Замена возвращающего значения при перегрузке виртуальных функций нужна при реализации расширяемой библиотеки потоков и контейнеров. Если абстрактный поток-ридитель (Parent) умеет работать с объектами вида А, причем его операторы << >> возвращают Parent&, а дочерний поток (Child) реализует также работу с объектами вида Б или просто объединяет двух шаблонных абстрактных Parent для А и Б, то станут невозможными записи вида: P>Child << A << Б, т.к. Child << A вернет Parent&, а тот не умеет работать с Б.
В данном случае можно обойтись и без ковариантных возвращаемых значений: сделай operator << невиртуальным и пусть он вызывает соответствующие виртуальные методы при необходимости.
P>Кроме того, VC часто путается при определении размеров объектов для классов, переданных как аргументы шаблона. И это, видимо, не связано с выравниванием (или связано косвенно, но выравнивание byte все равно не помогает). Просто, например, в модуле Picture.cpp объект Picture p весит 20 байт, а в модуле Template.cpp в инстанцированном шаблоне TTemplate<class T> : TTemplate<Picture> этот самый Т будет весить, например, 17.
(Не)работающий пример, please. Никогда не наблюдал в "нормальных" ситуациях. Обычно было связано с #pragma pack, макросами или подобной ерундой.
P>А вот насчет $43 за ComeauС. Я о нем раньше не слышал. Обязательно схожу по ссылке. И тогда такой вопрос: есть ли для него IDE и нельзя ли достать сам компилятор бесплатно? Все стремятся к бесплатному. За хорошую работу я с удовольствием заплачу, а вот если все окажется рекламой, то будет обидно.
В отношении соответствия стандарту и качества реализации работа хорошая, если не сказать больше — будь спок. В отношении среды, все просто: его можно встроить прямо в Visual Studio. В качестве back end он может использовать MSVC++, что, на мой взгляд, является еще одним плюсом, учитывая способности к оптимизации последнего.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте Павел Кузнецов, Вы писали:
ПК>В отношении соответствия стандарту и качества реализации работа хорошая, если не сказать больше — будь спок. В отношении среды, все просто: его можно встроить прямо в Visual Studio. В качестве back end он может использовать MSVC++, что, на мой взгляд, является еще одним плюсом, учитывая способности к оптимизации последнего.
Заманчиво.
А в среду от какой девстудии встраивается? Или в обе (6 и 7)?
И как его добывают на постсоветском пространстве? На сайте я что то ни слова бай ни слова скачай не нашел.
Уважаемый Павел Кузнецов.
ПК>Помимо соответствия стандарту надо еще учитывать другие факторы. У VC++ один из лучших на сегодня оптимизаторов, один из лучших показателей скорости компиляции, прекрасная среда, масса кода доступна для использования с VC++ и т.д.
Я и не спорю. Все прекрасно. Но не для тех целей.
ПК>В данном случае можно обойтись и без ковариантных возвращаемых значений: сделай operator << невиртуальным и пусть он вызывает соответствующие виртуальные методы при необходимости.
если так, то непонятно, зачем делать Put, Get виртуальными? И зачем вообще виртуальные функции... Собственно так я и делаю, только выглядит это странновато, поскольку приходится каждый раз заново описывать все операторы "туда-сюда".
А как в VC со ссылками на стандартные типы? У меня сейчас он не стоит. В Borland не работают операции Stream >> i, если i, к примеру, int, поскольку вместо ссылки оператору передается копия.
ПК>(Не)работающий пример, please. Никогда не наблюдал в "нормальных" ситуациях. Обычно было связано с #pragma pack, макросами или подобной ерундой.
К сожалению, код потерян. Могу только под честное слово сказать, что никаких макросов и pragma не было (кроме полученных от stdio).
Здравствуйте Юнусов Булат, Вы писали:
ЮБ>Здравствуйте Павел Кузнецов, Вы писали:
ПК>>В отношении соответствия стандарту и качества реализации работа хорошая, если не сказать больше — будь спок. В отношении среды, все просто: его можно встроить прямо в Visual Studio. В качестве back end он может использовать MSVC++, что, на мой взгляд, является еще одним плюсом, учитывая способности к оптимизации последнего.
ЮБ>Заманчиво. А в среду от какой девстудии встраивается? Или в обе (6 и 7)?
Насчет встраивания: в MSVC++, как в 6, так и в 7 можно встроить любой компилятор. Достаточно сделать программу-драйвер, которая будет перекодировать входные опции, предназначенные для MSVC++ в опции для компилятора. В свое время я делал подобную программу для запуска из Visual Studio компиляторов bcc32 и gcc. Делали ли Comeau Computing подобную программу, я не знаю, думаю, что что-нибудь в этом духе где-нибудь должно быть. Главное же совместимость форматов для отладки. В этом отношении bcc32 и gcc не лучшие варианты. Т.к. Comeau в качестве back end использует MSVC++, это значительно улучшает ситуацию.
ЮБ>И как его добывают на постсоветском пространстве? На сайте я что то ни слова бай ни слова скачай не нашел.
Отож. Надо покупать.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен