Безопасно ли использовать yes,no,i,out в качестве имени для переменных/перечисления?

Я прочитал документ о правиле именования С++, они кажутся пригодными для использования именами.

Однако на практике, когда я пытался создать переменную/перечисление с такими именами, как iter, yes, no, out, i, Error и т. д., Visual Studio странно использует для них курсив шрифт.

введите здесь описание изображения

Я могу только догадываться, что они зарезервированы для особых вещей, и IDE (например, процесс рефакторинга/переименования) может вести себя странно, если я буду использовать такие имена.

Безопасно ли использовать эти имена на практике? Я слишком паникую?

Извините, если это слишком новый или неуместный вопрос.
Я сомневаюсь в этом несколько недель, но боюсь спросить.


person cppBeginner    schedule 11.07.2017    source источник
comment
Эти имена разрешены для использования вами. iter и i обычно используются, когда просто ограничивают область действия цикла for. Имейте в виду, что это не очень хорошие имена, так как они не несут никакой смысловой нагрузки и не помогают вам понять код.   -  person BoBTFish    schedule 11.07.2017
comment
@BoBTFish Спасибо! Вы случайно не знаете о да, нет? Я не должен использовать их? Если так будет всегда, я предполагаю, что выделение имени курсивом является плохой практикой, и буду относиться к нему как к предупреждению компилятора.   -  person cppBeginner    schedule 11.07.2017
comment
@cppBeginner - это очень субъективно. В одной области эти имена могут иметь все значение, необходимое для понимания их использования. В другом они могут быть ужасно неадекватными. Мы не можем дать объективный ответ.   -  person StoryTeller - Unslander Monica    schedule 11.07.2017
comment
@cppBeginner Что бы вы предположили, если бы имя переменной было да? Это может быть что угодно. i в цикле for самоочевидно, потому что это обычная практика (вы хотите iтерировать...), в противном случае это мало что вам говорит. Вы всегда должны выбирать имена, которые ясно указывают на назначение переменной (bool isConnected; unsigned int numberOfClients; double tolerance; - последнее, например, в контексте некоторых математических вычислений).   -  person Aconcagua    schedule 11.07.2017
comment
@StoryTeller Я чувствую, что вещи, которые могут сломать код, это 1. глобальная переменная 2. макрос ..... Это то, что вы имеете в виду? Если да, то есть ли что-нибудь еще?   -  person cppBeginner    schedule 11.07.2017
comment
@Aconcagua Сегодня у меня есть желание закодировать enum class AttributeRenderUpdate{ Yes, No, Special };. Я впадаю в панику, когда вижу Yes курсивом. (Я легко паникую, потому что я новичок в С++.)   -  person cppBeginner    schedule 11.07.2017
comment
@cppBeginner - Нет. Упомянутые вами вещи покрываются затенением переменных и пространствами имен (также лучше избегать макросов). Я имел в виду, насколько велика часть кода, в которой используется переменная? Нужно ли мне прыгать вверх, просто чтобы напомнить, для какой цели служит переменная? Это критерий хорошего или плохого имени.   -  person StoryTeller - Unslander Monica    schedule 11.07.2017
comment
@cppBeginner В этом случае: поскольку вы использовали enum class A, а не только enum A, вы всегда используете yes/no/special в контексте перечисления: AttributeRenderUpdate::Yes. Так что в этом случае совершенно ясно, в чем смысл, так что все в порядке.   -  person Aconcagua    schedule 11.07.2017
comment
@cppBeginner Но это идентификаторы перечисления, а не имена переменных...   -  person Aconcagua    schedule 11.07.2017
comment
@StoryTeller Спасибо, теперь я понимаю. (В моем случае я намерен использовать его только в пределах ‹= 2 классов)   -  person cppBeginner    schedule 11.07.2017
comment
@Aconcagua Я так рад. Теперь я могу использовать его в своих перечислениях. Благодарить. XD   -  person cppBeginner    schedule 11.07.2017
comment
@cppBeginner Важный момент: какое бы имя вы ни выбрали для идентификатора, будь то переменная, член перечисления, класс, функция, ... - имя должно давать четкий намек на то, для чего служит конкретный элемент или что он делает. Конечно, вам часто придется искать компромисс между хорошим объяснением и краткостью (название функции в 200 символов вам тоже уже не поможет...). Вы можете провести небольшой тест для себя: покажите несколько фрагментов кода своему приятелю и позвольте ему объяснить, как, по ее мнению, предназначен этот элемент. Чем ближе он подходит к вашим собственным намерениям, тем лучше имя...   -  person Aconcagua    schedule 11.07.2017


Ответы (2)


Эти имена действительны и не причинят никакого «вреда», в стандарте только сказано:

  • Каждое имя, которое содержит двойное подчеркивание (_ _) или начинается с подчеркивания, за которым следует заглавная буква (2.11), зарезервировано реализацией для любого использования.

  • Каждое имя, начинающееся с подчеркивания, зарезервировано реализацией для использования в качестве имени в глобальном пространстве имен.

Это означает, что все ваши имена можно использовать в пользовательском коде. Visual Studio может просто иметь что-то для этих имен, поскольку i и iter обычно используются в цикле.

person Hatted Rooster    schedule 11.07.2017
comment
Вы имеете в виду, что они являются специфическими для Visual Studio симптомами? Благодарить - person cppBeginner; 11.07.2017
comment
@cppBeginner Да. - person Hatted Rooster; 11.07.2017

Эти имена не зарезервированы в стандартном C++, как объяснил Рик Эстли. Реализация может принимать дополнительные зарезервированные слова для предоставления языковых расширений, например ref class в C++/CLI. В некоторых случаях, например, в случае ref class, где ref – это контекстное ключевое слово, эти расширения только делают плохо сформированные программы правильными в рамках расширенного языка. В других случаях правильно сформированная программа может изменить свое значение или стать неправильно сформированной. В первом случае реализация по-прежнему соответствует стандарту C++, пока она выдает все обязательные диагностические данные; в последнем случае это, конечно, не соответствует.

Считается хорошей практикой делать последний тип расширений необязательными, например. используя параметр командной строки, чтобы реализация по-прежнему имела режим, в котором она полностью соответствует стандартам. Мое непосредственное предположение состоит в том, что VC++ на самом деле позволяет вам писать правильно сформированные программы, содержащие yes, no, i, iter, которые будут вести себя в соответствии с требованиями стандарта (несмотря на ошибки реализации).

Однако IDE — это другой зверь. Считается, что это выходит за рамки стандарта C++ и может препятствовать или даже мешать вам писать идеально корректный код. Это по-прежнему будет проблемой качества реализации или проблемой удовлетворенности клиентов, если хотите.

person Arne Vogel    schedule 11.07.2017