Почему C4062 Visual C ++ по умолчанию отключено? - PullRequest
4 голосов
/ 27 октября 2011

Согласно MSDN, Visual C ++ может выдавать C4062 предупреждение , когда

  • и перечисление используется в switch и
  • , для которых по крайней мере нет меткиодин элемент этого перечисления и
  • нет метки default: в switch

Теперь для меня такая ситуация, безусловно, заслуживает предупреждения - есть хороший шанс, что элемент ввопрос неправильно.Если ничего не нужно делать для некоторых элементов - разработчик может предоставить либо пустой case, либо default.

В чем может быть причина, почему это предупреждение отключено по умолчанию?

Ответы [ 4 ]

1 голос
/ 27 октября 2011

Есть определенные люди (в которых я себя включаю), которым нравится видеть «0 предупреждений» всякий раз, когда они строят. Добавление пустого регистра может быть правильным, если вы не обрабатываете только несколько случаев, но если вы работаете, скажем, с входной библиотекой, которая дает вам перечисление, показывающее, какая клавиша нажата, вам действительно нужно более 200 пустых случаев для ключи, которые вы не обрабатываете?

Конечно, вы можете сказать, просто добавьте пустой регистр по умолчанию, но:

  • В приведенном выше случае это на самом деле не имеет смыслового смысла
  • Теперь вы просто приглашаете C4061 (где все это заканчивается?)

Так что, если я получу эти предупреждения по умолчанию, я действительно установлю OCD на край

0 голосов
/ 27 октября 2011

Люди используют перечисления по разным причинам.

Многие другие люди (включая Microsoft, очевидно) будут использовать их с гораздо меньшим вниманием.Они просто именованные значения, и их группировки не очень интересны.В своей защите у них есть много возможностей для покрытия.

Есть несколько крайних случаев, например, пример с GuyCook, о которых никто не будет рад получить предупреждение.Он прав, что никто не хочет смотреть на это дерьмо.В таких случаях я поместил код обработки в свой собственный файл cpp, чтобы он не перекомпилировался без изменения заголовка.Хотелось бы, чтобы был более удобный способ решения этой проблемы, но я не думаю, что есть.

Я восхищаюсь языками (C # / Java?) За их способность игнорировать конкретные случаи предупреждения с аннотациями.

Тот факт, что вы озадачены его упущением, означает, что вы, вероятно, используете их так, как они являются наиболее значимыми в дизайне.Лично я считаю, что перечисления должны подвергаться той же проверке, что и уроки в отношении сцепления и сплоченности.Если кто-то изменяет перечисление, код должен быть пересмотрен.Если бы кто-то изменил интерфейс в классе, который вы унаследовали, вы бы хотели знать об этом, не так ли?

У них нет , чтобы использовать их таким образом.Перечисление - это просто инструмент, некоторые предпочитают использовать его как синоним материала.:)

0 голосов
/ 27 октября 2011

Эти предупреждения, вероятно, предназначены для включения в каждом конкретном случае.Попытка скомпилировать проект C ++ с /Wall дает тысячи предупреждений от собственных заголовков Microsoft.

Теперь вы пытаетесь отладить большой кусок кода, в котором вы подозреваете, что где-то отсутствует оператор case(или вы хотите исключить эту гипотезу).Затем вы включаете C4062.

Если вы хорошо выглядите, все эти отключенные предупреждения очень педантичны, но их можно использовать для поиска скрытых ошибок.Вы действительно хотите включить C4264 ?

0 голосов
/ 27 октября 2011

Если это предупреждение включено по умолчанию, то enum s может не всегда расширяться, без редактирования существующего (уже работающего) кода. например,

// (c) 2009
// header.h
enum E { a, b, c };
...
// legacy.cpp
switch(e)
{
case a:  ...
case b:  ...
case c:  ...
}

Предположим, через 2 года разработчик редактирует только header.h. Файл реализации хорошо протестирован и не изменен (legacy.cpp)

// (c) 2011
// header.h
enum E { a, b, c, d, e };  // added 'd','e'

Из-за обязательного предупреждения legacy.cpp может быть залито предупреждениями в местах, где d и e не обработаны, что может быть нежелательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...