Во-первых, вы описываете предупреждение, а не сообщение об ошибке. Компиляторы не обязаны выдавать такие предупреждения, и им по-прежнему разрешается успешно компилировать ваш код - поскольку это технически допустимо.
Практически, большинство современных компиляторов могут выдавать такие предупреждения, но в конфигурации по умолчанию они не делают. При использовании gcc компилятор может быть дополнительно настроен на выдачу таких предупреждений (например, с использованием подходящих параметров командной строки).
Единственная причина, по которой это никогда не было проблемой в linux, заключается в том, что выбранный вами компилятор не был настроен (или использован с подходящим параметром командной строки) для выдачи предупреждения.
Большинство компиляторов проводят обширный анализ кода либо напрямую (во время синтаксического анализа исходного кода), либо путем анализа некоторого внутреннего представления этого кода. Анализ необходим для определения наличия в коде диагностируемых ошибок, чтобы определить, как оптимизировать производительность.
Из-за такого анализа большинство компиляторов могут и действительно обнаруживают ситуации, которые могут быть проблематичными, даже если код не содержит диагностируемых ошибок (т. Е. Он "достаточно корректен", чтобы стандарт C ++ не требовал диагностики).
В этом случае существует ряд различных выводов, к которым может прийти компилятор, в зависимости от того, как он проводит анализ.
- Существует
switch
. В принципе, код после оператора switch
может быть выполнен.
- Код после переключения достигает конца функции без
return
, и функция возвращает значение. Результатом этого является потенциальное неопределенное поведение.
Если анализ компилятора зашел так далеко (и компилятор настроен на предупреждение о таких вещах), критерии для выдачи предупреждения будут выполнены. Необходим дальнейший анализ, если предупреждение может быть подавлено, например, определите, что все возможные значения e
представлены case
, и что во всех случаях есть оператор return
. Дело в том, что поставщик компилятора может решить не проводить такой анализ и, следовательно, не подавлять предупреждения по разным причинам.
- Выполнение дополнительного анализа увеличивает время компиляции. Производители конкурируют между собой, утверждая, что их компилятор работает быстрее, поэтому НЕ делать некоторый анализ, поэтому выгодно сократить время компиляции;
- Поставщик компилятора может посчитать, что лучше отмечать потенциальные проблемы, даже если код на самом деле правильный. Учитывая выбор между выдачей посторонних предупреждений или не предупреждением о некоторых вещах, продавец может предпочесть давать посторонние предупреждения.
В любом из этих случаев анализ для определения возможности подавления предупреждения не будет выполнен, поэтому предупреждение не будет подавлено. Компилятор просто не проведет достаточного анализа, чтобы определить, что все пути выполнения через функцию сталкиваются с оператором return
.
В конце концов, вам нужно рассматривать предупреждения компилятора как признак потенциальных проблем, а затем принимать разумное решение о том, стоит ли беспокоиться о потенциальной проблеме. Ваши варианты отсюда включают подавление предупреждения (например, использование параметра командной строки, который вызывает подавление предупреждения), изменение кода для предотвращения предупреждения (например, добавление return
после случая switch
и / или default
в switch
, который возвращается).