Требуется ли, чтобы стандартная библиотека соответствовала стандартам? - PullRequest
4 голосов
/ 24 июня 2011

Требуется ли стандартная библиотека для соответствия стандарту? Такое ощущение, что стандартная библиотека не соответствует стандарту. Основой этого чувства являются сообщения об ошибках, генерируемые компилятором (-ами). Например, иногда GCC выдает сообщения об ошибках, которые начинаются с префикса __gxx и многих других, которые я сейчас не помню. Но видя их, я чувствую, что это очень специфичные для компилятора сообщения, и разные компиляторы не смогут скомпилировать стандартную библиотеку, предоставляемую GCC, и наоборот. Это правда?

Вопрос можно задать другими словами как:

  • Может ли стандартная библиотека, предоставляемая одним компилятором, компилироваться с другими компиляторами?
  • Когда мы говорим, что определенный компилятор является стандартным конформантом, означает ли он автоматически , означает ли это, что stdlib, который идет с ним, также является стандартным конформантом? Или это просто означает, что этот компилятор может компилировать стандартный код , написанный нами, программистами?
  • Могу ли я использовать стандартную библиотеку, предоставляемую одним компилятором, в моем проекте, который использует другой компилятор для компиляции проекта? Соответствует ли переносимость стандартному соответствию?

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

Ответы [ 8 ]

5 голосов
/ 24 июня 2011

Стандартная библиотека - это деталь реализации. Он даже не может быть «скомпилирован» в том смысле, что стандарт не требует, чтобы он состоял из «файлов» [заголовков]:

174) Заголовок не обязательно является исходным файлом, и последовательности, разделенные символами <и> в именах заголовков, не обязательно действительны имена исходных файлов (16.2).

Стандарт тщательно облегчает требования к реализации, так что библиотека может быть «встроена» в компилятор (встроенные функции a.k.a). Например, расширение пространства имен std или # определение имени, используемого в стандартной библиотеке, дает вам неопределенное поведение.

4 голосов
/ 24 июня 2011

Да, стандартные библиотеки должны соответствовать стандарту, но в этом есть некоторая гибкость. Стандарт не требует конкретной реализации функций, и реализация может свободно добавлять внутренние функции, атрибуты ... при условии соблюдения требований.

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

По конкретным вопросам ниже:

Может ли стандартная библиотека, предоставляемая одним компилятором, компилироваться с другими компиляторами?

Некоторые будут, некоторые нет. реализация стандартной библиотеки может использовать встроенные функции компилятора для некоторых операций, функций, присутствующих только в одной платформе, но не для других ... Некоторые реализации STL могут быть скомпилированы с использованием различных компиляторов, например, таких как STLPort, Dinkumware (которые также поставляется с VS, с некоторыми модификациями VS)

Когда мы говорим, что определенный компилятор является стандартным конформантом, означает ли это автоматически, что stdlib, который идет с ним, также является константой стандарта? Или это просто означает, что этот компилятор может компилировать стандартный код, написанный нами, программистами?

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

Могу ли я использовать стандартную библиотеку, предоставленную одним компилятором, в моем проекте, который использует другой компилятор для компиляции проекта? Является ли портативность такой же, как стандартное соответствие?

Не обязательно.

3 голосов
/ 24 июня 2011

Требуется ли, чтобы стандартная библиотека соответствовала стандарту?Такое ощущение, что стандартная библиотека не соответствует стандарту.

По определению, реализация должна соответствовать стандарту, чтобы соответствовать стандарту, да.

В противном случае это не такреализация Стандартной библиотеки C ++, но с некоторыми другими вещами.

Когда мы говорим, что определенный компилятор является стандартным, означает ли это, что автоматически поставляемый с ним stdlib также является стандартным?

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

Но это всего лишь игра слов.

Могу ли я использовать стандартныйбиблиотека, предоставленная одним компилятором, в моем проекте, который использует другой компилятор для компиляции проекта?Является ли портативность такой же, как стандартное соответствие?

Конечно, нет.Две совместимые реализации могут быть полностью несовместимы друг с другом.

Например, иногда GCC выдает сообщения об ошибках, которые начинаются с префикса __gxx и многие другие, которые я не помню на данный момент.

Отлично.Цепочка инструментов может реализовать библиотеку, как она выберет, если интерфейс соответствует стандарту.Стандарт не говорит, что реализация не может использовать символ __gxx в своей работе.


BTW

Хотя, действительно говорит, что программист можетв некоторых случаях не используйте символы с начальными подчеркиваниями!

Вам не разрешено ([lib.requirements] / [requirements]) использовать любое имя, которое:

  1. содержит два последовательных подчеркивания,
  2. начинается с подчеркивания, за которым следует заглавная буква
  3. начинается с подчеркивания и находится в глобальном пространстве имен

Также вC ++ 0x, буквенные суффиксы, которые не начинаются с подчеркивания, зарезервированы.

1 голос
/ 24 июня 2011

что это означает, когда мы говорим, что компилятор X является стандартно-совместимым

Это означает, что компилятор предоставляет стандартной библиотеке все требования стандарта иСама реализация соответствует всем требованиям стандарта.Дело в том, что «требования» к стандартной библиотеке довольно общие после общего интерфейса.

1 голос
/ 24 июня 2011

API библиотеки для пользователя должен быть стандартным;реализация не обязана быть, однако.Вы видите пример этого, когда стандартная версия функции заменяется оптимизированным вариантом (с другим именем, потому что иногда замена возможна только в некоторых обстоятельствах, например, когда может быть доказано соответствующее выравнивание).Это также означает, что реализация стандартной библиотеки одного компилятора не может быть построена другим компилятором (что может привести к проблемам с загрузкой при переносе, но это другая проблема).

0 голосов
/ 24 июня 2011

Может ли стандартная библиотека, предоставляемая одним компилятором, компилироваться с другими Составители?

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

Когда мы говорим, что определенный компилятор является стандартным это автоматически означает, что stdlib что идет с этим также Стандарт-совместимый? Или это просто означает, что этот компилятор может компилировать стандартный код, написанный нас, программистов?

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

Могу ли я использовать стандартную библиотеку, предоставленную одним компилятором, в моем проект, который использует другой компилятор для компиляции проекта? Является портативность такая же, как стандартное соответствие?

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

0 голосов
/ 24 июня 2011

Стандарт накладывает ограничения на интерфейс стандартной библиотеки, а не на реализацию.Он делает все возможное, чтобы дать понять, что стандартные заголовки библиотеки могут делать то, что пользовательский код не может ... __MACRO__NAME__ зарезервировано, например, для реализации.И, очевидно, только реализация может поместить все эти функции и типы в пространство имен std.

В основном, «переносимая» реализация может быть написана.Но он, вероятно, будет менее производительным ... в качестве простого примера рассмотрим традиционную реализацию макроса offsetof.Обычно это подразумевает разыменование нулевого указателя, что является формально неопределенным поведением, но поскольку реализация знает, как работает его платформа, это нормально.Портативная версия не может этого сделать, поэтому ей придется фактически создать новый экземпляр предоставленного типа, чтобы поддерживать все в рабочем состоянии.

Довольно много признаков типа в C ++ 0x, вероятно, требуют компилятораподдержка, которая делает «портативную» реализацию где-то между трудным и невозможным.Например, нет стандартного способа проанализировать, является ли произвольный тип POD, поэтому boost::is_pod требует поддержки пользователя через специализацию на некоторых платформах.

Существует также мнение, что большая часть стандартной библиотекине только заголовок.Другие биты могут быть написаны на совершенно другом языке ... при условии, что все они правильно связаны, это не имеет значения.Если среда выполнения реализована в Lisp, очевидно, что это не будет C ++-совместимый код, который можно надежно поместить в другую цепочку инструментов компилятора.

0 голосов
/ 24 июня 2011

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

Стандартная реализация библиотеки не должна быть переносимой.Они могут быть, но далеко не обязательно.

...