В настоящее время я разрабатываю библиотеку для QNX (x86) с использованием GCC, и я хочу сделать некоторые символы, которые используются исключительно в библиотеке и невидимы для других модулей, особенно для кода, который использует библиотеку.
Это уже работает, но, исследуя, как его достичь, я нашел очень тревожный проход в документации GCC (см. http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Code-Gen-Options.html#Code-Gen-Options, объяснение флагов -fvisibility):
Несмотря на номенклатуру, дефолт всегда означает общественность; то есть доступной для связи с внешним объектом. защищенных и внутреннее довольно бесполезно в реальном использовании, поэтому единственное другое обычно используемый параметр скрыт. Значение по умолчанию, если -fvisibility не указанный по умолчанию, т.е. сделать каждый символ общедоступным - это вызывает такое же поведение, как и предыдущие версии GCC.
Мне очень интересно, насколько видимость "внутренняя" довольно бесполезна в реальном использовании. Из того, что я понял из другого отрывка из документации GCC (http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Function-Attributes.html#Function-Attributes, объяснения атрибута видимости), видимость "внутренняя" еще сильнее (более полезно для меня), чем видимость "скрыта":
Внутренняя видимость похожа на скрытую видимость, но с дополнительными специфическая для процессора семантика. Если иное не указано psABI, GCC определяет внутреннюю видимость, чтобы означать, что функция никогда вызывается из другого модуля. Сравните это со скрытыми функциями, которые, в то время как они не могут напрямую ссылаться на другие модули, могут быть косвенно ссылаются на указатели функций. Указывая, что функция не может быть вызвана извне модуля, GCC может экземпляр опускает нагрузку регистра ПИК, поскольку известно, что вызывающая функция загрузила правильное значение.
Может кто-нибудь объяснить в глубину?
Спасибо вам заблаговременно!