В стандартной библиотеке (glibc) я вижу функции, определенные с ведущими двойными подчеркиваниями, например __mmap
в sys/mman.h
. В чем цель? И как мы можем по-прежнему вызывать функцию mmap
, которая, кажется, нигде не объявлена. Я имею в виду, что для этого мы включаем sys/mman.h
, но sys/mman.h
не объявляет mmap
, он объявляет только __mmap
.
Значение двойного подчеркивания в начале
Ответ 1
Из руководства GNU:
В дополнение к именам, описанным в этом руководстве, зарезервированные имена включают все внешние идентификаторы (глобальные функции и переменные), которые начните с символа подчеркивания ('_) и всех идентификаторов, независимо от использования которые начинаются с двух подчеркиваний или подчеркивания, за которыми следует Заглавная буква - это зарезервированные имена. Это так, что библиотека и файлы заголовков могут определять функции, переменные и макросы для внутренних цели без риска конфликта с именами в пользовательских программах.
Это соглашение, которое также используется поставщиками C и С++.
Ответ 2
ISO 9899: 2011
7.1.3 Зарезервированные идентификаторы
Каждый заголовок объявляет или определяет все идентификаторы, перечисленные в его связанный подзаголовок и, возможно, объявляет или определяет идентификаторы перечисленные в соответствующем подпункте идентификаторы, которые всегда зарезервированы либо для любого использования, либо для использования в качестве идентификаторы области файла.
- Все идентификаторы, начинающиеся с подчеркивание и буква верхнего регистра или другое подчеркивание: всегда зарезервировано для любого использования.
- Все идентификаторы, начинающиеся с Подчеркивание всегда зарезервировано для использования в качестве идентификаторов с областью файлов как в обычном, так и в имени тегов.
Ответ 3
Имена с ведущим двойным подчеркиванием зарезервированы для внутреннего использования реализацией (компилятор/стандартная библиотека/и т.д.). Они никогда не должны появляться в вашем коде. Цель этого зарезервированного пространства имен - предоставить имена заголовков систем, которые они могут использовать, без потенциального столкновения с именами, используемыми в вашей программе.