Отсутствие include не дает ошибки компиляции в RedHat 6 - PullRequest
1 голос
/ 27 июня 2019

Этот фрагмент не может быть скомпилирован, поскольку в заголовке numeric находится заголовок *1003*, который не включен.

#include <algorithm>
#include <vector>

int main () {
    std::vector<int> vec{ 1, 2, 3, 4 };
    return std::accumulate(vec.begin(), vec.end(),0);
}

Проводник компилятора * * * . дает мне правильное сообщение об ошибке

<source>(6): error: namespace "std" has no member "accumulate"
      return std::accumulate(vec.begin(), vec.end(),0);

Я использую RedHat 6 и версию компилятора intel 18.0.3.Если я скомпилирую его с этим параметром, я не получу ошибку, и результат в порядке.Предупреждение не отображается, даже если используется -Wall.

Мой вопрос: почему я не получаю соответствующее сообщение об ошибке?

1 Ответ

5 голосов
/ 27 июня 2019

почему я не получаю соответствующее сообщение об ошибке?

Поскольку один из стандартных заголовков библиотеки <algorithm> или <vector>, который вы используете для компиляции, включает в себя <numeric> сами. Это общая проблема переносимости; ваш код компилируется с определенной реализацией стандартной библиотеки, но не компилируется с другой. Реализации библиотеки могут включать стандартные заголовки в стандартные заголовки. Возможно, некоторые функции в вашем <algorithm> были реализованы с использованием любого из алгоритмов <numeric>, и вот вы здесь.

Ошибка компилятора - причина, по которой существуют такие инструменты, как include-what-you-use . Используя iwyu, она добавит #include <numeric> к вашему фрагменту. Также обратите внимание, что никакие флаги предупреждения не повлияют на результат компиляции. Либо вы получаете серьезную ошибку компилятора, либо ничего.

...