В C ++ принято называть переменные-члены с каким-то префиксом, обозначающим тот факт, что они являются переменными-членами, а не локальными переменными или параметрами. Если вы пришли из MFC, вы, вероятно, будете использовать m_foo
. Я тоже видел myFoo
иногда.
C # (или, возможно, просто .NET), кажется, рекомендует использовать только подчеркивание, как в _foo
. Это разрешено стандартом C ++?
c++
naming-conventions
standards
c++-faq
Роджер Липскомб
источник
источник
Ответы:
Правила (которые не изменились в C ++ 11):
std
пространстве имен зарезервировано. (Вы можете добавить шаблонные специализации, хотя.)Из стандарта C ++ 2003 года:
Поскольку C ++ основан на стандарте C (1.1 / 2, C ++ 03), а C99 является нормативным справочным документом (1.2 / 1, C ++ 03), они также применяются в стандарте C 1999 года:
Другие ограничения могут применяться. Например, стандарт POSIX резервирует множество идентификаторов, которые могут отображаться в обычном коде:
E
заглавной буквы после цифры или заглавной буквы:is
илиto
следуют буквы нижнего регистраLC_
заглавной буквыf
илиl
зарезервированыSIG
заглавной буквы, зарезервированыSIG_
заглавной буквы, зарезервированыstr
,mem
или сwcs
последующим строчной буквой защищеныPRI
илиSCN
сопровождаемые любой строчной буквой илиX
зарезервированные_t
, зарезервированыХотя использование этих имен в ваших собственных целях в настоящее время может не вызывать проблем, они повышают вероятность конфликта с будущими версиями этого стандарта.
Лично я просто не начинаю идентификаторы с подчеркивания. Новое дополнение к моему правилу: нигде не используйте двойные подчеркивания, что легко, поскольку я редко использую подчеркивание.
После исследования этой статьи я больше не заканчиваю свои идентификаторы,
_t
поскольку это зарезервировано стандартом POSIX.Правило о том, что любой идентификатор заканчивается на
_t
меня, очень удивило. Я думаю, что это стандарт POSIX (пока не уверен), требующий разъяснений, а также официальных главы и стиха. Это из руководства по GNU libtool , в котором перечислены зарезервированные имена.CesarB предоставил следующую ссылку на зарезервированные символы POSIX 2004 и отмечает, что «там можно найти много других зарезервированных префиксов и суффиксов ...». В POSIX 2008 зарезервированные символы определяются здесь. Ограничения несколько более нюансированы, чем указанные выше.
источник
_Bool
и_Imaginary
не существует в C ++? Язык C ++ определяется явно, а не в терминах «правок» в C, в противном случае стандарт может быть намного короче!Правила, позволяющие избежать столкновения имен, содержатся в стандарте C ++ (см. Книгу Страуструпа) и упоминаются гуру C ++ (Саттер и т. Д.).
Личное правило
Поскольку я не хотел иметь дело с делами и хотел простое правило, я разработал личное , простое и правильное:
При именовании символа вы избежите столкновения с компилятором / ОС / стандартными библиотеками, если вы:
Конечно, размещение вашего кода в уникальном пространстве имен также помогает избежать коллизий (но не защитит от злых макросов)
Некоторые примеры
(Я использую макросы, потому что они больше загрязняют код символов C / C ++, но это может быть что угодно, от имени переменной до имени класса)
Выдержки из черновика C ++ 0x
Из файла n3242.pdf (я ожидаю, что окончательный стандартный текст будет похож):
Но и:
Это последнее предложение вводит в заблуждение, если только вы не считаете, что имя, начинающееся с одного подчеркивания и сопровождаемое строчной буквой, будет Ok, если оно не определено в глобальном пространстве имен ...
источник
__WRONG_AGAIN__
содержит два последовательных подчеркивания (два в начале и два в конце), так что это неправильно в соответствии со стандартом.WRONG__WRONG
содержит два последовательных подчеркивания (два в середине), так что это неправильно в соответствии со стандартом__attribute__
для GCC).1234567L
или4.0f
; IIRC это относится к ohttp: //en.cppreference.com/w/cpp/language/user_literalWhy is there any problem of having two consecutive underscores in the middle according to the standard?
Потому что стандарт говорит, что они зарезервированы. Это не совет о хорошем или плохом стиле. Это решение от стандарта. Почему они решили это? Я предполагаю, что первые компиляторы уже использовали такие соглашения неофициально до стандартизации.Из MSDN :
Это означает, что вы можете использовать одно подчеркивание в качестве префикса переменной-члена, если за ним следует строчная буква.
По-видимому, это взято из раздела 17.4.3.1.2 стандарта C ++, но я не могу найти оригинальный источник полного стандарта в Интернете.
Смотрите также этот вопрос .
источник
Что касается другой части вопроса, обычно ставят подчеркивание в конце имени переменной, чтобы не конфликтовать с чем-то внутренним.
Я делаю это даже внутри классов и пространств имен, потому что тогда мне нужно запомнить только одно правило (по сравнению с «в конце имени в глобальной области видимости и в начале имени везде»).
источник
Да, подчеркивания могут использоваться в любом месте идентификатора. Я считаю, что правила таковы: любой из az, AZ, _ в первом символе и те + 0-9 для следующих символов.
Префикс префикса часто встречается в коде C - одиночное подчеркивание означает «частное», а двойное подчеркивание обычно зарезервировано для использования компилятором.
источник