Подтвердить что ты не робот

Значение двойного подчеркивания в начале

В стандартной библиотеке (glibc) я вижу функции, определенные с ведущими двойными подчеркиваниями, например __mmap в sys/mman.h. В чем цель? И как мы можем по-прежнему вызывать функцию mmap, которая, кажется, нигде не объявлена. Я имею в виду, что для этого мы включаем sys/mman.h, но sys/mman.h не объявляет mmap, он объявляет только __mmap.

4b9b3361

Ответ 1

Из руководства GNU:

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

Это соглашение, которое также используется поставщиками C и С++.

Ответ 2

ISO 9899: 2011

7.1.3 Зарезервированные идентификаторы

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

- Все идентификаторы, начинающиеся с подчеркивание и буква верхнего регистра или другое подчеркивание: всегда зарезервировано для любого использования.

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

Ответ 3

Имена с ведущим двойным подчеркиванием зарезервированы для внутреннего использования реализацией (компилятор/стандартная библиотека/и т.д.). Они никогда не должны появляться в вашем коде. Цель этого зарезервированного пространства имен - предоставить имена заголовков систем, которые они могут использовать, без потенциального столкновения с именами, используемыми в вашей программе.