Статические функции в драйвере устройства Linux?
Есть ли причина, по которой большинство определений функций в драйвере устройства в коде Linux определяется как статическое? Для этого есть причина?
Мне сказали, что это для определения объема и предотвращения загрязнения пространства имен, кто-нибудь может объяснить это подробно, почему статическое определение используется в этом контексте?
3 ответа
Функции, объявленные как статические, не видны за пределами модуля перевода, в котором они определены (модуль перевода в основном представляет собой файл.c). Если функцию не нужно вызывать извне файла, то она должна быть статической, чтобы не загрязнять глобальное пространство имен. Это делает конфликты между одинаковыми именами менее вероятными. Экспортируемые символы обычно идентифицируются с каким-либо тегом подсистемы, что дополнительно уменьшает возможности конфликта.
Часто указатели на эти функции заканчиваются в структурах, поэтому они на самом деле вызываются из файла, в котором они определены, но не по имени их функции.
По тем же причинам вы используете статический в любом коде. Вы должны только "публиковать" свои вызовы API, все остальное может привести к злоупотреблениям, таким как возможность вызова внутренних функций извне драйвера, что почти наверняка будет катастрофическим.
Хорошая практика программирования - делать видимым для внешнего мира только то, что необходимо. Вот что такое инкапсуляция.
Я согласен. Это обычная и мудрая практика в любом C-коде, а не только в коде ядра! Не думайте, что это подходит только для вещей низкого уровня, любой код C, который простирается на один файл.c, должен был подумать об этом