std :: декларация накопления до и после gcc 5.4

#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 не соответствует стандарту, вы не найдете какой-либо опции, которая сделает ее совместимой.