Разрешено ли реализации выдавать диагностическое сообщение для правильно сформированной программы?
Например, некоторые компиляторы выдают предупреждение о неиспользованном результате выражения при компиляции следующей правильно сформированной программы:
int main() { 0; }
Разрешено ли таким компиляторам считать это предупреждение диагностическим сообщением?
Реализация может выдать (1)любое количество диагностических сообщений, которые он хочет, при условии, что он выдает требуемую диагностику.
Он должен принимать правильные программы в той степени, в которой он может,
C ++ 14 §1.4 / 2:
» Если программа не содержит нарушений правил в этом международном стандарте, соответствующая
Mentation должен в пределах своих ресурсов принимать и правильно выполнять эту программу «
но он может выдать диагностику по этому поводу.
Стандарт C ++ не делает различий между Сообщения об ошибках а также предупреждающие сообщения, но это де-факто стандарт. Сообщение об ошибке означает (по соглашению), что двоичный файл не создается, потому что проблема слишком серьезна. Предупреждающее сообщение означает (по соглашению), что существует потенциальная проблема, но не прямое нарушение языковых правил, и поэтому создается двоичный файл, если нет также ошибок.
Иногда линии немного размыты, где реализации некорректно, но по прагматическим причинам принимают недопустимый код, только с предупреждениями или даже без диагностики. Поэтому для нового кода можно попросить компилятор рассматривать каждое предупреждение как ошибку и стремиться к чистые компиляции. И, насколько я понимаю, сейчас это совершенно не редкость.
С некоторыми компиляторами, например Visual C ++, однако, это может быть проблематично, потому что компилятор выдает слишком много Глупое-предупреждение, предупреждения о совершенно законных и не проблемных конструкциях. Тогда нужно как-то подавить эти предупреждения. Например. с помощью #pragma
директивы, если это возможно, или путем переписывания кода.
К счастью, для Visual C ++ существует заголовок с таким #pragma
директивы, которые отключают глупые предупреждения, составлено около пяти лет назад в результате работы сообщества в группе comp.lang.c ++ Usenet. И, к счастью, для сообщества выпуск Visual Studio 2015 есть расширение, предоставляющее шаблон проекта с включенным заголовком. Это оба я.
Для рассматриваемого кода,
int main() { 0; }
… вместо того, чтобы подавлять предупреждение, которое обычно является полезным, вы должны переписать код, чтобы выразить свое намерение явно:
int main() { (void)0; }
(void)
cast сообщает компилятору, что вы намерены отбросить значение этого выражения.
В случае использования этой конструкции для неиспользуемого аргумента функции, вы можете дополнительно объявить неполный класс с тем же именем, чтобы предотвратить случайное использование имени:
(void)arg_name; struct arg_name;
Но так как это нетрадиционно, это может сбить с толку других программистов — с компиляторами, которые я использую, сообщение об ошибке для дальнейшего использования имени не совсем интуитивно понятно.
(1) Кроме как отметил Коломбо в своем ответе, C ++ 14 §14.6 / 8 «Не должно быть никакой диагностики для шаблона, для которого может быть сформирована действительная специализация».
Совершенно нормально выдавать диагностику, если в любом соответствующем сценарии соблюдаются приведенные ниже правила. §1.4 / 2:
Хотя этот международный стандарт устанавливает только требования к C ++
реализации, эти требования часто легче понять, если
они сформулированы как требования к программам, частям программ или
выполнение программ. Такие требования имеют следующее значение:
Если в программе нет нарушений правил настоящего международного стандарта, соответствующая реализация должна, в
его ресурсные ограничения, принять и правильно выполнить эту программу.Если программа содержит нарушение какого-либо диагностируемого правила или вхождение конструкции, описанной в настоящем стандарте как
«Условно поддерживаемый», когда реализация не поддерживает
эта конструкция, соответствующая реализация должна выпустить по крайней мере один
диагностическое сообщениеЕсли программа содержит нарушение правила, для которого не требуется диагностика, настоящий международный стандарт не устанавливает
реализации в отношении этой программы.
«Принятие» направлено исключительно на признание реализации, что это правильно сформированная программа, а не на отсутствие какой-либо диагностики. В конце концов, несмотря на любые предупреждения, выдаваемые в процессе, реализации по-прежнему дают запрашиваемый объектный файл.
Тем не менее, есть одно правило, касающееся шаблонов, которое требует, чтобы диагностика не выдавалась; §14.6 / 8:
Для шаблона, для которого действительный
специализация может быть сформирована.