#c #gcc
#c #gcc
Вопрос:
Однако, согласно cppreference, std::accumulate
сохраняется в <numeric>
, когда я компилирую с использованием gcc 5.4:
$gcc --version | grep gcc
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
Я обнаружил, что оно успешно компилируется, если используется только #include <algorithm>
. Я могу воспроизвести это, используя gcc 5.3 на godbolt. Правильное поведение наблюдается в более поздних версиях gcc.
Я пытаюсь перенести нашу программу разработки с Ubuntu 16.04 на 18.04 (gcc 5.4 на gcc 7.3), и разработчики продолжают допускать эту ошибку (в том числе <algorithm>
вместо <numeric>
), и поскольку gcc 5.4 не жалуется, мы не замечаем этого, пока я не создам с более поздними версиями gcc. В конечном итоге мы все будем на 18.04, но пока…
Есть ли способ заставить gcc 5.4 помечать это как ошибку или предупреждение?
Комментарии:
1. Как правило, любой файл заголовка сам по себе может включать в себя любой другой файл заголовка. Единственный способ обеспечить переносимость — явно включить правильный файл заголовка. И единственный способ помешать gcc успешно скомпилировать это, — это самостоятельно переписать его заголовочные файлы.
2. Я надеялся, что, возможно, это было какое-то нестандартное соглашение, в котором где-то был флаг или #define, но, оказывается,
bits/stl_algo.h
включаетrandom
(который в какой-то момент включаетnumeric
), в то время как более поздние реализации библиотеки включают новый файл (bits/uniform_int_dist.h
), который не включаетnumeric
. Это то, чего я боялся.3. gcc имеет давнюю историческую репутацию высококачественного, соответствующего стандартам компилятора C . Шансы на то, что gcc примет решение «эх, мы будем играть быстро и свободно со стандартами по умолчанию, но установим какой-нибудь дополнительный переключатель, который более точно соответствует спецификации C «, невелики, равны нулю. Каждая последующая версия gcc стремится ближе следовать стандарту. Как вы уже заметили здесь. Это не вариант. Если какая-то часть gcc не соответствует стандарту, вы не найдете какой-либо опции, которая сделает ее совместимой.