• C++之类和函数权限访问总结(二百二十七)


    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

    优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

    人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

    更多原创,欢迎关注:Android系统攻城狮

    欢迎关注Android系统攻城狮

    1.前言

    本篇目的:C++之类和函数权限访问总结。

    __attribute__((visibility("hidden")))是GCC编译器提供的一个属性(Attribute),用于控制符号(symbols)在共享库(shared library)中的可见性。

    可见性定义了一个符号(如函数、变量、类)是否可以被其他源文件或共享库访问。通过设置可见性属性,可以控制符号的可见性范围,从而提高代码的安全性和封装性。

    visibility("hidden")__attribute__宏的一个参数,指定了符号的隐藏可见性。当一个符号被标记为hidden时,该符号对于其他目标文件或共享库是不可见的,无法访问。

    __attribute__((visibility("hidden")))通常用于隐藏不应暴露给外部的实现细节,以防止其他代码直接访问和修改这些内部实现。这有助于提高代码的安全性和可维护性,同时遵循封装原则。

    下面是__attribute__((visibility("hidden")))的一些常见使用场景:

    1. 隐藏内部实现:可以将某些类、函数、变量标记为__attribute__((visibility("hidden"))),这样其他代码无法直接访问这些实现细节,只能通过公共接口进行交互。

    2. 防止符号冲突:当在共享库中存在多个同名符号时,通过设置不同的可见性属性,可以避免符号冲突和链接错误。

    3. 减少符号表大小:设置一些私有符号为隐藏可见性,可以减少符号表的大小,从而降低链接时间和可执行文件的大小。

    4. 保护敏感信息:可以使用隐藏可见性来隐藏包含敏感信息的符号,以增加代码的安全性。

    需要注意的是,__attribute__((visibility("hidden")))只对支持这一特性的编译器有效,且使用该特性可能会导致一些潜在问题,如符号无法被动态链接到其他代码,因此需要谨慎使用。

    __attribute__((visibility("hidden")))可以通过设置符号的可见性,控制代码的封装性和安全性,使其更加模块化和可维护。然而,在使用时需要考虑到特定环境和编译器的兼容性以及潜在的问题。

    2.应用实例

    v1.0. 其他类可以访问:

    #define C2_HIDE __attribute__((visibility("hidden")));
    
    // 可以访问 ParamBuilder 的类
    class OtherClass {
    public:
        void accessParamBuilder() {
            ParamBuilder pb;
            // perform operations on ParamBuilder...
        }
    };
    
    class C2_HIDE ParamBuilder {
        // ParamBuilder 类的成员定义...
    };
    
    int main() {
        OtherClass oc;
        oc.accessParamBuilder();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 注意OtherClass类可以访问accessParamBuilder.

    v2.0. 其他类不可以访问:

    #define C2_HIDE __attribute__((visibility("hidden")));
    
    // 无法访问 ParamBuilder 的类
    class AnotherClass {
    public:
        void tryAccessParamBuilder() {
            ParamBuilder pb;  // 编译错误:undeclared identifier 'ParamBuilder'
        }
    };
    
    class C2_HIDE ParamBuilder {
        // ParamBuilder 类的成员定义...
    };
    
    int main() {
        AnotherClass ac;
        ac.tryAccessParamBuilder();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 注意OtherClass类不可以访问tryAccessParamBuilder.

    v3.0. 其他类可以访问其内部函数:

    #define C2_HIDE __attribute__((visibility("hidden")));
    
    class OtherClass {
    public:
        void accessParamBuilderFunction() {
            ParamBuilder pb;
            pb.internalFunction();  // 调用 ParamBuilder 的内部函数
        }
    };
    
    class C2_HIDE ParamBuilder {
    public:
        void internalFunction() {
            // 内部函数的定义...
        }
    };
    
    int main() {
        OtherClass oc;
        oc.accessParamBuilderFunction();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 注意OtherClass类可以访问accessParamBuilderFunction.

    v4.0. 其他类不可以访问其内部函数:

    #define C2_HIDE __attribute__((visibility("hidden")));
    
    class AnotherClass {
    public:
        void tryAccessParamBuilderFunction() {
            ParamBuilder pb;
            pb.internalFunction();  // 编译错误:'internalFunction' is a private member of 'ParamBuilder'
        }
    };
    
    class C2_HIDE ParamBuilder {
    private:
        void internalFunction() {
            // 内部函数的定义...
        }
    };
    
    int main() {
        AnotherClass ac;
        ac.tryAccessParamBuilderFunction();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 注意OtherClass类不可以访问tryAccessParamBuilderFunction.

    v5.0. 其他类完全可以访问

    class OtherClass {
    public:
        void accessParamBuilder() {
            ParamBuilder pb;
            // 调用和操作 ParamBuilder
        }
    };
    
    class ParamBuilder {
    public:
        void publicFunction() {
            // 公共函数的实现
        }
    };
    
    int main() {
        OtherClass oc;
        oc.accessParamBuilder();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 注意OtherClass类完全可以访问accessParamBuilder.
  • 相关阅读:
    Airtest自定义启动器支持批量运行脚本,并兼容在AirtestIDE中使用
    安装 tensorflow==1.15.2 遇见的问题
    C++之AVL树详解
    《web课程设计》 基于HTML+CSS+JavaScript实现中国水墨风的小学学校网站模板(6个网页)
    大数据Hadoop之——部署hadoop+hive+Mysql环境(Linux)
    若依VUE 从一个页面跳转另一个页面并携带参数
    UniApp 自定义条件编译详细使用流程
    【Swift 60秒】04 - Doubles and booleans
    科普RFID读写器的工作原理
    小球垂直跳动,C语言模拟重力加速度
  • 原文地址:https://blog.csdn.net/u010164190/article/details/133148145