Почему люди так много используют __ (двойное подчеркивание) в C ++ - PullRequest
84 голосов
/ 22 октября 2008

Я просматривал некоторый код C ++ с открытым исходным кодом и заметил, что в коде много двойных недооценок, в основном в начале имен переменных.

return __CYGWIN__;

Просто интересно, есть ли причина для этого, или это просто некоторые люди, кодирующие стили? Я думаю, что мне трудно читать.

Ответы [ 7 ]

119 голосов
/ 22 октября 2008

С Программирование на C ++, правила и рекомендации :

Использование двух подчеркиваний (`__ ') в идентификаторах зарезервировано для внутреннего использования компилятором в соответствии со стандартом ANSI-C.

Подчеркивания (`_ ') часто используются в именах библиотечных функций (таких как" _main "и" _exit "). Чтобы избежать коллизий, не начинайте идентификатор с подчеркивания.

48 голосов
/ 22 октября 2008

Если они не чувствуют, что они являются "частью реализации", то есть стандартными библиотеками, то они не должны.

Правила довольно специфичны и немного более подробны, чем предлагали некоторые другие.

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

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

Именно поэтому Microsoft использует имена функций с начальным подчеркиванием и строчными буквами для многих из своих основных функций библиотеки времени выполнения, которые не являются частью стандарта C ++. Эти имена функций гарантированно не конфликтуют ни со стандартными функциями C ++, ни с функциями пользовательского кода.

34 голосов
/ 22 октября 2008

В соответствии со стандартом C ++ идентификаторы, начинающиеся с одного подчеркивания, зарезервированы для библиотек. Идентификаторы, начинающиеся с двух подчеркиваний, зарезервированы для поставщиков компиляторов.

10 голосов
/ 22 октября 2008

Предыдущие комментарии верны. __Symbol__ - это, как правило, магический токен, предоставляемый вашим полезным поставщиком компиляторов (или препроцессоров). Возможно, наиболее широко используемыми из них являются __FILE__ и __LINE__, которые расширяются препроцессором C для указания текущего имени файла и номера строки. Это удобно, когда вы хотите регистрировать какой-либо сбой утверждения программы, включая текстовое расположение ошибки.

8 голосов
/ 22 октября 2008

Это то, что вы не должны делать в «нормальном» коде. Это гарантирует, что компиляторы и системные библиотеки могут определять символы, которые не будут конфликтовать с вашими.

1 голос
/ 22 октября 2008

В дополнение к библиотекам, о которых ответили многие другие, некоторые люди также называют макросы или значения #define для использования с препроцессором. Это упростило бы работу и, возможно, позволило бы обойти ошибки в старых компиляторах.

Как и другие упомянутые, это помогает предотвратить конфликт имен и помогает разграничить переменные библиотеки и ваши собственные.

0 голосов
/ 31 мая 2019

Самый популярный ответ цитируется Программирование на C ++: правила и рекомендации :

"Использование двух подчеркиваний (` __ ') в идентификаторах зарезервировано для внутреннего использования компилятором в соответствии со стандартом ANSI-C. "

Однако утверждение этой страницы выглядит как необоснованное

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

C ++ (текущий рабочий проект, доступ к 2019-5-26): состояния в lex.name:

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

TL; DR: двойные подчеркивания зарезервированы для реализации

Хотя этот вопрос относится к C ++, я привел соответствующие разделы из стандартов C 99 и 17:

C99 раздел 7.1.3

  • Все идентификаторы, которые начинаются с символа подчеркивания и либо с заглавной буквы, либо другого символа подчеркивания, всегда зарезервированы для любого использования.
  • Все идентификаторы, которые начинаются с подчеркивания, всегда зарезервированы для использования в качестве идентификаторов с областью действия файла как в обычном, так и в имени тега. пространства.

C17 говорит то же самое, что и C99.

...