Что случилось с C++ (clang и std)

yroslavasako

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

In file included from /usr/include/qt4/QtCore/QtGlobal:1:
In file included from /usr/include/qt4/QtCore/qglobal.h:68:
In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/include/g++-v4/algorithm:62:
In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/include/g++-v4/bits/stl_algo.h:65:
In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/include/g++-v4/random:39:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/include/g++-v4/cstdio:120:11: error: no member named 'gets' in the global namespace
using ::gets;
~~^
1 error generated.

Что навевает мне следующие мысли:
1. Совместимость в си пошла лесом. Даже на уровне хедеров. То ли синтаксис меняется в деталях, то ли std уже не стандартное.
2. Шланг бомжует на чужом std
3. Проблемы совместимости усугубляются тем, что надо подбирать пару clang-gcc, потому что синтаксис зависит от первого, а std от второго.
Так ли всё плохо, как мне кажется?

Dasar

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

Sveta84

cppreference
std::gets was deprecated in C++11 and removed from C++14.
Такие дела.

yroslavasako

То есть, точно также как я собираю multilib, я должен одни и те же библиотеки собирать разными компилерами и хранить несколько версий одновременно?

Dasar

я должен одни и те же библиотеки собирать разными компилерами и хранить несколько версий одновременно?
Либо делать такой костыль, либо поправить исходники(попросить/заплатить разработчику чтобы он поправил): добавив ifdef для твоего окружения или переписав всё на единообразный рабочий вариант.

yroslavasako

В смысле добавить ifdef? Судя по тому, что библиотеки собираются любым компилятором, он в них уже есть.

Dasar

В смысле добавить ifdef?
если используется C++14, то не использовать gets

Maurog

Совместимость в си пошла лесом.
очень сомневаюсь, скорее всего это баг
http://stackoverflow.com/questions/17775390/clang-3-3-in-c1y...

Maurog

std::gets was deprecated in C++11 and removed from C++14
функцию могут выбросить из формального стандарта, но не могут выкинуть из компилятора. ибо обратная совместимость - это конек сей

Maurog

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

Dasar

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