2010-10-12 7 views
10

Для языка, такого как C++, существование стандарта является обязательным. И хорошие компиляторы стараются изо всех сил (ну, по крайней мере, большинство хороших компиляторов). Многие компиляторы имеют языковые расширения, некоторые из которых разрешены стандартом, некоторые из которых не являются. Из последнего типа 2 примера: TypeOfНасколько важно соблюдение стандартов?

  1. ССЗ

  2. Составители Microsoft, позволяют чисто виртуальная функция объявления, чтобы иметь как чисто-спецификатор (= 0) и определение (которое запрещено стандартом - давайте не будем обсуждать, почему, это другая тема :)

(есть много других примеров)

Оба примера могут быть использованы в следующих sense: example1 - очень полезная функция, которая будет доступна в C++ 0x под другим именем. example2 также полезен, и Microsoft решила не соблюдать запрет, который не имеет смысла.

И я рад, что компиляторы предоставляют языковые расширения, которые помогают нам разработчикам в нашей рутине. Но вот вопрос: не должен ли быть вариант, который, когда он установлен, требует, чтобы компилятор был как можно более стандартным, независимо от того, согласны ли они со стандартом или нет. Например, визуальная студия имеет такой вариант, который называется отключением языковых расширений. Но эй, они все еще позволяют example2.

Я хочу, чтобы все правильно поняли мой вопрос. Это БОЛЬШАЯ вещь, которую MSVC допускает example2, и мне очень хотелось бы, чтобы эта функция была в стандарте. Он не нарушает совместимый код, он ничего не делает. Это просто не стандарт.

Вы хотите, чтобы этот файл отключился при отключении языковых расширений, равном true2? Обратите внимание, что слова microsoft, example2 и т. Д. Являются заполнителями :) Почему?

Снова, просто чтобы убедиться. Ключевым моментом является: если компилятор потрудится предоставить совместимую версию (опционально заданную в настройках) (в ее пределах, например, я не говорю об экспорте) для определенной функции, когда они предоставляют лучшую альтернативу, которая не является стандартной и является возможно, даже надмножество стандарта, не нарушая ничего.

+1

пример2 разрешен в g ++ тоже, а не только MSVC. – DumbCoder

+0

mingw не ... но все же, как вы можете видеть, это не вопрос) –

+4

Я уверен, что стандарт позволяет определять чисто виртуальный. http://en.wikipedia.org/wiki/Virtual_function "Хотя чистые виртуальные методы, как правило, не имеют импментации в классе, который их объявляет, чистым виртуальным методам на C++ разрешено содержать импиментацию в своем объявляющем классе, обеспечивая возврат или поведение по умолчанию что производный класс может делегировать, если это необходимо »., но ваш вопрос по-прежнему интересен. –

ответ

7

Соответствие стандартам имеет важное значение для фундаментальной причине, что делает проще код для сохранения. Это проявляется несколькими способами:

  • Портирование из одной версии компилятора в другую. Я однажды должен был разместить приложение с 1,2 млн. LOC с VC6 на VC9. VC6 был известен тем, что был ужасно несовместимым, даже когда он был новым. Он допускал несовместимый код даже на самых высоких уровнях предупреждения, которые новый компилятор отклонил на самом низком уровне. Если код был написан более уступчивым способом, в первую очередь, этот проект не будет (не должен) занял 3 месяца.

  • Портирование с одной платформы на другую. Как вы говорите, у современных компиляторов MS есть языковые расширения. Некоторые из них совместно используются компиляторами на других платформах, некоторые - нет. Даже если они разделены, поведение может быть несколько иным. Написание совместимого кода, а использование этих расширений делает ваш код правильным из слова go. «Портирование» просто тянет дерево вниз и делает перестройку, а не копает в недрах вашего приложения, пытаясь понять, почему 3 бита неправильны.

  • C++ определяется стандартом. Расширения, используемые компиляторами, меняют язык. Новые программисты, выходящие в сети, которые знают C++, но не диалект, используемый вашим компилятором, будут быстрее ускоряться, если вы напишете на Standard C++, а не на диалект, который поддерживает ваш компилятор.

+1

_I однажды пришлось опубликовать приложение с 1,2 млн. LOC от VC6 до VC9._ О, мой. –

+3

Я думаю, что нужно упомянуть, что особенно с кодом шаблона неплохо протестировать, по крайней мере, с двумя коллегами. В Windows я использую для этого g ++. Comeu Online также пригодится для проверки правильности небольших фрагментов кода; однако у меня нет опыта использования полного компилятора Comeau. –

+0

Я рад сказать, что мне никогда не приходилось переносить приложение с 1,6 млн. LOC с VC6 на VC9. Я могу представить себе боль. ;) – jalf

3

«Не сломать ничего» - это такой скользкий склон в долгосрочной перспективе, что его лучше вообще избегать. Основной продукт моей компании состоял из нескольких поколений компиляторов (впервые написанных в 1991 году, с RW) и расчесывания через расширения компилятора и нарушения стандартов, когда это было время перехода на новую систему dev, потребовалось много усилий.

Но если есть возможность отключить или, по крайней мере, предупредить о «нестандартном расширении», я согласен с этим. 34, 70, 6.

1

Насколько важно соблюдение стандартов зависит от того, чего вы пытаетесь достичь.

Если вы пишете программу, которая никогда не будет перенесена за пределы ее текущей среды (особенно программа, которую вы не планируете разрабатывать/поддерживать в течение длительного времени), это не очень важно. Все, что работает, работает.

Если вам нужна ваша программа, чтобы оставаться актуальной в течение длительного времени и быть легко переносимой в разные среды, чем вы хотите, чтобы она соответствовала стандартам, поскольку это единственный способ (более или менее) гарантировать, что она будет работают повсюду.

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

+0

На самом деле вы правы, но вы говорите с точки зрения разработчика. Мы должны взглянуть на точку зрения поставщика компилятора –

+0

@Armen: компиляторы построены для разработчиков, а не для компиляторов. – Donotalo

3

Мне бы, конечно, нужен вариант, который запрещает расширение языка для отключения всех языковых расширений. Зачем?

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

«Лучше» - субъективное слово. Расширения языка полезны для некоторых разработчиков, но делают вещи более трудными для других.

+0

В MSVC есть один, по крайней мере, с версии 8 на. Однако включение этого файла не позволяет компилировать даже самый маленький код окна. –

2

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

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

Итак, учитывая, что, я ожидаю, что MSVC будет стандартным только по умолчанию. То же самое с gcC++.

Статистика: 40, 90, 15

4

Во-первых, ответ на несколько комментариев.Расширение MS VC в вопросе, как это:

struct extension { 
    virtual void func() = 0 { /* function body here */ } 
}; 

стандарт позволяет реализовать чистую виртуальную функцию, но не «на месте», как это, так что вы должны написать что-то вроде этого, вместо:

struct standard { 
    virtual void func() = 0; 
}; 

void standard::func() { ; } 

Что касается исходного вопроса, да, я думаю, что это хорошая идея для компилятора иметь режим, в котором он следует (и обеспечивает) стандарт как можно точнее. Хотя большинство компиляторов имеют это, результат не обязательно как Точное представление стандарта, как вы/я бы хотел.

Как минимум ИМО, о единственном ответе на это для людей, которые заботятся о переносимости (и используют), по крайней мере, несколько компиляторов на регулярной основе. Для C++ один из них должен основываться на интерфейсе EDG; Я считаю, что он имеет значительно лучшее соответствие, чем большинство других. Если вы используете компилятор Intel на регулярной основе, все равно, все в порядке. В противном случае я бы рекомендовал получить копию Comeau C++; это всего лишь 50 долларов, и это самое близкое к «ссылке». Вы также можете использовать Comeau в Интернете, но если вы используете его на регулярной основе, стоит приобрести собственную копию.

Не звучать, как карандаш EDG или Comeau или что-то еще, но даже если вам не все равно о переносимости, я бы порекомендовал получать копию в любом случае - это, как правило, создает отличные сообщения об ошибках. Его чистые, ясные сообщения об ошибках (все сами по себе) с годами сэкономили достаточно времени, чтобы заплатить за компилятор несколько раз.

Редактировать: Глядя на это снова, некоторые советы выглядят довольно устаревшими, особенно рекомендация для EDG/Comeau. За три года, прошедших с того момента, как я изначально написал это, Кланг перешел от чисто экспериментального к вполне разумному для использования в производстве. Аналогичным образом, gcc-поддерживающие (IMO) также добились больших успехов в соответствии.

В то же время компания Comeau не выпустила ни одну новую версию своего компилятора и, но была выпущена новая версия стандарта C++. В результате Комо сейчас довольно устарел в отношении нынешнего стандарта (и ситуация, похоже, ухудшается, а не лучше - комитет уже одобрил проект комитета нового стандарта, который, вероятно, станет C + +14).

Как таковой, хотя я рекомендовал Комо в то время, мне было бы трудно (в лучшем случае) сделать это сегодня. К счастью, большинство преимуществ, которые он предоставил, теперь доступны в более компиляторах основного состава - как Clang, так и gcc улучшили соответствие (по существу), как описано выше, и их сообщения об ошибках также значительно улучшились (Clang уделяет большое внимание более эффективные сообщения об ошибках, почти с самого начала).

Итог: я бы порекомендовал иметь как минимум два компилятора, установленные и доступные, но сегодня я бы выбрал разные компиляторы, чем я, когда я изначально написал этот ответ.

+1

Я единственный, кто считает, что соблюдение необходимо не только для портирования, но и для студентов/образовательных цели? То есть, я прочитал действительно трудный отрывок в стандарте, я думал, что понял это, теперь я хочу проверить его на реальном компиляторе ... Согласен/не согласен? –

+0

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

+1

Как я уже сказал, я мог представить себе компилятор, единственная цель которого заключалась в проверке соответствия, предоставлении действительно замечательных описательных предупреждений и ошибок и, возможно, не предоставлении наиболее оптимизированного кода. Есть продукты, такие как Lint, которые делают это и не производят код вообще - они хороши для такого контроля соответствия. По этой причине я использую статический анализатор LLVM (потому что я не доверяю своему компилятору, чтобы поддерживать стандарт) –

2

Я считаю, что соблюдение стандартов очень важно.

Я всегда считаю, что исходный код больше для читателей, чем для машин (ов). Таким образом, для того, чтобы сообщить намерение программиста читателю, соблюдение стандарта похоже на язык самого низкого общего знаменателя.

Как дома, так и на работе, я использую g ++, и я наложил его на следующие флаги для строгого соответствия стандарту.

-Wall -Wextra -ansi -pedantic -std=c++98 

Проверьте эту страницу на Strict ANSI/ISO

Я не эксперт стандарты, но это хорошо служил мне. Я написал библиотеки контейнеров в стиле STL, которые работают как на разных платформах, например. 32-разрядный Linux, 64-разрядный Linux, 32-разрядный Solaris и 32-разрядная встроенная операционная система.

+0

К сожалению, '-ansi -pedantic -std = C++ 98' не дает вам строгого стандартного соответствия –

2

Учитывать индикаторы на автомобилях (в некоторых юрисдикциях называются «сигналами поворота»); они являются надежным способом определить, в каком направлении кто-то собирается отключить круговое движение ... пока только один человек не использует их вообще. Тогда вся система распадается.

Это не «кто-нибудь пострадал» или явно «сломать что-нибудь» в IE, когда они позволили document.someId использоваться в качестве ярлыка для document.getElementById('someId') .... однако, сделал икру целое поколение кодеров и даже книги, которые, следовательно, считали, что все в порядке и правильно, потому что «это работает». Затем, внезапно, десять миллионов результирующих веб-сайтов были совершенно не переносимыми.

Стандарты важны для функциональной совместимости, и если вы не следуете им, то мало смысла иметь их вообще.

Собаки, соблюдающие стандарты, могут получить ненависть за «педантизм», но на самом деле, пока все последуют примеру, у вас будут проблемы с переносимостью и совместимостью навсегда.

+0

, если люди используют' document.someId', а стандарт не имеет такой функции - это означает, что стандарт устаревает, а msdn становится стандартный, де-факто. – Abyx

+0

Вы, кажется, поднимаете совершенно правильную точку зрения о стандартизации обычной практики (ANSI/ISO C, C++ 98) и стандартизации впереди (HTML5, некоторые части C++ 11). Первый очень желателен, последний гораздо более спорный (и менее эффективный). Однако я не вижу, как это связано с вопросом (хотя я не являюсь нисходящим). –

+0

@Abyx: Тем не менее, это не так. –