«Диагностическое сообщение» - это термин искусства в стандарте C ++. Скорее всего, когда кто-то говорит «диагностика компилятора», он смутно думает об этом термине, но не применяет его правильно.
Стандарт имеет несколько категорий для элементов кода, которые не соответствуют требованиям стандарта, и способ, которым компилятор может отвечать, зависит от того, к какой категории относится ошибка.
Большинство требований в стандарте содержатся в «наборе диагностируемых правил ». Эти правила состоят из всех синтаксических и семантических требований в стандарте, за исключением тех, которые явно помечены как «не требующие диагностики», и тех, которые описаны как приводящие к «неопределенному поведению». (Это из [intro.compliance] / 1).
Если программа нарушает диагностируемое правило, соответствующая реализация «выдаст хотя бы одно диагностическое сообщение».
Итак, в общем, большинство ошибок кодирования требуют диагностического сообщения. Теперь остается открытым вопрос о том, что представляет собой «диагностическое сообщение», и это определено в стандарте как «сообщение, принадлежащее определенному реализацией подмножеству выходных сообщений реализации».
Это означает, что компилятор может говорить с вами все, что он хочет или так мало, как хочет, за исключением того, что при обнаружении определенных ошибок кодирования он должен что-то вам сказать.
Поэтому, когда компилятор говорит вам, что вы должны добавить круглые скобки вокруг операций ||
в if (a && b || c && d)
, это просто болтовня. Код действителен, его значение четко определено, и он просто дает вам совет по стилю (и плохой совет).
Когда он сообщает, что не знает тип x
в typedef int foo; fo0 x;
, он отвечает на диагностируемую ошибку. Если документация реализации говорит вам, что это сообщение является диагностическим сообщением, то это то, чем оно является. И вообще это то, что делают компиляторы.
Обратите внимание, что компилятор не требуется, чтобы отказаться от компиляции кода с диагностируемой ошибкой. Требование only заключается в выдаче диагностического сообщения. Сделав это, компилятор может продолжить компиляцию кода с результатом, специфичным для реализации. Основная причина такой гибкости заключается в том, что она допускает специфичные для компилятора расширения.
Компиляторы обычно различают предупреждения и ошибки; стандарт не делает. Требуется, чтобы при представлении кода, который не нарушал ни одного из требований стандарта, и если программа не слишком велика (в неопределенном смысле), компилятор должен создавать исполняемую программу. Формально это так: «Если программа не содержит нарушений правил в этом международном стандарте, соответствующая реализация должна в пределах своих ресурсов принять и правильно выполнить эту программу». [Intro.compliance] /2.