C++ GCC/MinGW Пути: ssp, ext, tr1; параллельный, ext, бит, экспериментальный

Вопрос:

В дереве папок GCC/MinGW есть дубликаты некоторых имен файлов заголовков в папках: ssp, ext, tr1; параллельные, ext, биты и экспериментальные...

Следует ли избегать явных директив include для этих папок в производственном коде -как лучший метод?

ИЛИ, есть ли в сети документация, касающаяся законных сценариев, в которых эти папки должны явно использоваться в операторах #include?

Примечания: 1. SSP: (Stack Smashing Protector) 2. tr1: Технический отчет 1 ( Stack Link) выглядит устаревшим.

Цепочка инструментов:

C++ 11 и C++ 14:

Eclipse CDT, используя Clang ToolChain, с Google Test API и MinGW (5.1).

На момент написания этой статьи Clang LibC++ еще не был создан для Windows, поэтому используется MinGW: Posix, SEH, X86_64, bundle.

<stdio.h> Папки:

  1. включить / stdio.h
  2. включить / C++ / tr1 / stdio.h
  3. Библиотека / GCC /x86_0w64-mingw32/5.1.0/ включать / SSP / stdio.h

<algorithm> Папки:

  1. включить / C++ / алгоритм
  2. включить / C++ / экспериментальный / алгоритм
  3. включить / C++ / внутр / алгоритм
  4. включить / C++ / параллельный / алгоритм

1 ответ

Решение

(перемещение / расширение от комментариев)

Я всегда видел вещи, включенные явно из этих мест, например <bits/c++config.h>, <ext/bitmap_allocator.h>, <tr1/cmath> и тому подобное, никогда не добавляйте один из этих каталогов непосредственно в путь поиска включения. Обратите внимание, что, насколько я всегда понял, каталог битов в основном следует оставлять один, поскольку он содержит материал, зависящий от версии реализации (не обязательно стабильный с точки зрения API). Я не могу найти явную документацию по этому вопросу, но общую структуру библиотеки (со стандартными общедоступными заголовками в корне, которые включают их bits коллеги), кажется, предлагает так.

Следует ли этого избегать как лучшую практику? Или по каким сценариям их следует использовать?

Исключая bitsвсе остальные могут быть использованы, если вы готовы принять, что вы зависите от libstdc++ и не только стандарт C++, как указано в документации по адресу http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_headers.html:

"Менее нестандартные" вещи - это то, что вы найдете в tr1; он взят из C++ TR1, который не является "реальным" стандартом, но содержит рекомендации по тому, что следует включить в будущий стандарт C++11; до 2011 года вы могли использовать его и ожидать некоторой степени взаимодействия с другими компиляторами, сегодня вы можете спокойно его игнорировать и просто использовать C++11 (который на самом деле стандартизирован и отличается некоторыми деталями).

Все ext являются расширениями libstdC++, некоторые из них взяты из SGI STL, некоторые являются более новыми разработками; не исключено, что некоторые из них будут включены в стандартное предложение C++, но в этом случае они, вероятно, переместятся в другое место.

parallel каталог содержит параллельные реализации некоторых классических алгоритмов STL ( подробности здесь); Опять же, у IIRC есть предложение стандартизировать их, но, как указано выше, я ожидаю, что они переместятся куда-то еще в случае их стандартизации, поскольку стандартизация редко оставляет предложения без изменений, и им потребуется способ, позволяющий старым программам нормально работать с старые заголовки / семантика.

experimental содержит материал для новых экспериментальных Технических спецификаций (концепция аналогична TR1), которые должны перейти к "настоящей" стандартной библиотеке, когда будут выпущены новые стандарты; на данный момент в моей установке gcc 4.9.2 я могу найти только string_view а также optional там, но некоторые другие вещи должны прийти; лично, как и в случае с tr1, я бы подождал, пока прилив установится в новом стандарте, прежде чем использовать эти заголовки в производственном коде, потому что, как они есть, они все еще являются чем-то вроде движущейся цели, а качество кода не наравне с остальной библиотекой (это, как следует из названия, все еще экспериментальный материал).

ssp папка содержит материал Stack Smashing Protector. От OSDev, ( Ссылка):

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

Другие вопросы по тегам