Я просматривал некоторый код C ++ с открытым исходным кодом и заметил много двойных значений под оценками, которые использовались в коде, в основном в начале имен переменных.
return __CYGWIN__;
Просто интересно, есть ли причина для этого, или просто некоторые люди кодируют стили? Я думаю, что мне трудно читать.
c++
double-underscore
Натан В
источник
источник
#define FOO 1
но не должны,#define __FOO__ 1
и поэтому реализация может свободно использовать имя__FOO__
для своих собственных макросов, переменных, функций и т. Д.Ответы:
Из программирования на C ++, правила и рекомендации :
источник
namespace
было представлено._main
.Если они не считают себя «частью реализации», то есть стандартными библиотеками, им не следует этого делать.
Правила довольно конкретны и немного более подробны, чем предлагают некоторые другие.
Все идентификаторы, содержащие двойное подчеркивание или начинающиеся с подчеркивания, за которым следует заглавная буква, зарезервированы для использования реализации во всех областях, т.е. они могут использоваться для макросов.
Кроме того, все другие идентификаторы, начинающиеся с подчеркивания (т. Е. Не сопровождаемые другим подчеркиванием или прописной буквой), зарезервированы для реализации в глобальной области. Это означает, что вы можете использовать эти идентификаторы в своих собственных пространствах имен или в определениях классов.
Вот почему Microsoft использует имена функций с начальным подчеркиванием и все в нижнем регистре для многих своих основных функций библиотеки времени выполнения, которые не являются частью стандарта C ++. Гарантируется, что эти имена функций не будут конфликтовать ни со стандартными функциями C ++, ни с функциями пользовательского кода.
источник
Согласно стандарту C ++ идентификаторы, начинающиеся с одного подчеркивания, зарезервированы для библиотек. Идентификаторы, начинающиеся с двух знаков подчеркивания, зарезервированы для поставщиков компиляторов.
источник
Предыдущие комментарии верны.
__Symbol__
обычно является волшебным токеном, предоставляемым вашим полезным поставщиком компилятора (или препроцессора). Возможно, наиболее широко используются__FILE__
и__LINE__
, которые расширяются препроцессором C для указания текущего имени файла и номера строки. Это удобно, когда вы хотите зарегистрировать какой-либо сбой утверждения программы, включая текстовое местоположение ошибки.источник
Это то, чего вы не должны делать в «нормальном» коде. Это гарантирует, что компиляторы и системные библиотеки могут определять символы, которые не будут конфликтовать с вашими.
источник
Двойные подчеркивания зарезервированы для реализации
Самый популярный ответ цитирует Программирование на C ++: правила и рекомендации :
Однако, прочитав несколько стандартов C ++ и C, я не смог найти упоминания о том, что символы подчеркивания ограничиваются только внутренним использованием компилятора. Стандарты являются более общими, с двойным подчеркиванием для реализации .
C ++
В C ++ (текущий рабочий проект, по состоянию на 26 мая 2019 г.) говорится
lex.name
:C
Хотя этот вопрос относится к C ++, я привел соответствующие разделы из стандартов C 99 и 17:
C99 раздел 7.1.3
C17 говорит то же самое, что и C99.
Какая реализация ?
Для C / C ++ реализация свободно относится к набору ресурсов, необходимых для создания исполняемого файла из исходных файлов пользователя. Это включает в себя:
Примеры реализации
В Википедии упоминается ряд различных реализаций C ++ . (без привязки, ctrl + f "реализация")
Вот пример реализации C / C ++ Digital Mars, зарезервировавшей некоторые ключевые слова для их функции.
источник
В дополнение к библиотекам, о которых отзывались многие другие люди, некоторые люди также называют макросы или значения #define для использования с препроцессором. Это упростило бы работу и, возможно, позволило бы обойти ошибки в старых компиляторах.
Как и другие упомянутые, он помогает предотвратить конфликт имен и помогает разграничить переменные библиотеки и ваши собственные.
источник