g++ -std= C++0x и совместимость
Я использую g++ 4.4 для компиляции общей библиотеки на Linux. Я хотел бы использовать некоторые функции C++11, если могу, в библиотеке, но я не могу обновить версию компилятора или требовать каких-либо специальных переключателей компилятора для пользователей моей библиотеки.
У меня два вопроса, и я не могу найти окончательный ответ.
Если я скомпилирую разделяемую библиотеку с -std= C++0x или -std=g++0x, я гарантирую, что программе, использующей мою библиотеку, эти переключатели не нужны (при условии, что у меня нет функций C++0x в файлы заголовков)? Кажется, это работает, но я не хочу подписываться на тонкие проблемы в будущем.
Стандартная библиотека для C++11 в g++ 4.4 довольно неполна. Поскольку большая часть стандартной библиотеки предназначена только для заголовков, а файлы заголовков gnu, как правило, заполнены версией ifdefs, я думаю, что может быть способ использовать более свежую версию, по крайней мере, файлов заголовков в libstdC++. Я не могу использовать другой.so для этого, хотя. Я уверен, что смогу сделать это вместе, но возможно ли сделать что-то подобное правильно?
Благодарю.
2 ответа
1. Если я скомпилирую разделяемую библиотеку с -std= C++0x или -std=g++0x, я гарантирую, что программе, использующей мою библиотеку, эти переключатели не нужны (при условии, что у меня нет C++0x особенности в заголовочных файлах)? Кажется, это работает, но я не хочу подписываться на тонкие проблемы в будущем.
Поддержка C++11 все еще была экспериментальной в выпусках GCC 4.x (она больше не является экспериментальной с GCC 5 и далее). Несмотря на то, что мы постарались сохранить работоспособность, ответ - нет, но вы не гарантируете, что это сработает во всех случаях. Есть ряд изменений ABI, вызванных использованием -std=c++0x
это может вызвать проблемы для программ, которые смешивают код C++03 и код C++11, для получения дополнительной информации см. http://gcc.gnu.org/wiki/Cxx11AbiCompatibility. Если ваша библиотека не экспортирует ни один из символов, описанных на этой странице, то все будет в порядке.
2. Стандартная библиотека для C++11 в g++ 4.4 довольно неполна. Поскольку большая часть стандартной библиотеки предназначена только для заголовков, а файлы заголовков gnu, как правило, заполнены версией ifdefs, я думаю, что может быть способ использовать более свежую версию, по крайней мере, файлов заголовков в libstdC++. Я не могу использовать другой.so для этого, хотя. Я уверен, что смогу сделать это вместе, но возможно ли сделать что-то подобное правильно?
Нет, абсолютно никаких шансов, что это сработает. Заголовки из более поздних версий используют функции, не поддерживаемые 4.4, и даже если вы могли бы использовать их, вам нужно будет использовать более новые libstdc++.so
, Просто нет.
Заголовки не полны версии #ifdefs
почти единственные, что вы найдете, это чеки на __GXX_EXPERIMENTAL_CXX0X__
который определяется G ++ при использовании -std=c++0x
но это не означает, что ваша версия 4.4 поддерживает лямбды, нестатические инициализаторы элементов данных, правильную семантику ссылочных значений, функции по умолчанию / удаленные и т. д., которые более поздние заголовки широко используют. Вы должны использовать заголовки libstdC++ с той же версией GCC, с которой они пришли.
Короче говоря, если вам нужна правильная поддержка C++11, вам нужно использовать более новый компилятор.
Если вы не можете использовать более новый компилятор, вы не сможете получить надлежащую поддержку C++11.
Я бы не стал это пробовать. Все, что требуется, - это один определенный в заголовке C++11 макрос для изменения определения класса или функции, и ваш конечный пользователь будет нарушать правило одного определения. Я думаю, что это может быть очень тонким.
А затем на аналогичной ноте, есть vector(count, item = T())
конструктор, которого больше нет в C++11 (теперь это два конструктора).
Короче говоря, вы должны быть очень осторожны с тем, какие стандартные компоненты библиотеки вы использовали в своей библиотеке, чтобы не нарушать одно правило определения, и я не могу себе представить, что риск поломки стоит использовать эти функции.
Что вы можете сделать, это использовать boost
а также tr1
заполнять языковые пробелы до тех пор, пока вы не сможете использовать новый компилятор и / или не получите права требовать от ваших конечных пользователей компиляции с поддержкой C++11.