代码之家  ›  专栏  ›  技术社区  ›  Paul Belanger

属性(可见性(“默认”))是否适用于嵌套结构?

  •  -1
  • Paul Belanger  · 技术社区  · 6 年前

    结构是这样的:

    水电站

    class Foo
    {
    public:
        Foo();
        ~Foo();
    
    
        void method1();
        void method2();
    
    private:
        struct impl;
        std::unique_ptr<impl> p;
    };
    

    食品cpp

    struct Foo::impl
    {
        method1()
        {
            ....
        }
        method2()
        {
            ...
        }
    
        private_thing()
        {
            ...
        }
    
    }
    
    Foo::Foo():p(make_unique<impl>()){}
    Foo::~Foo(){}
    void Foo::method1(){ p->method1();}
    void Foo::method2(){ p->method2();}
    

    我想隐藏一些实现的符号,所以 编译时使用 -fvisibility=hidden 加上 __attribute__((visibility("default"))) class Foo 定义如下:

    class __attribute__((visibility("default"))) Foo {...};
    

    我的问题是visibility属性是否应用于方法 使所有成员都可见,或者 他们躲起来。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Paul Belanger    6 年前

    用“nm-CD foo.so”检查代码,我们可以看到嵌套结构实际上是可见的:

    0000000000201048 B __bss_start
                     w __cxa_finalize
    0000000000201048 D _edata
    0000000000201050 B _end
    00000000000009cc T _fini
                     w __gmon_start__
    0000000000000780 T _init
                     w _ITM_deregisterTMCloneTable
                     w _ITM_registerTMCloneTable
                     w _Jv_RegisterClasses
                     U operator delete(void*)
    000000000000099c W Foo::impl::method1()
    00000000000009a8 W Foo::impl::method2()
    00000000000009b4 W Foo::impl::impl()
    00000000000009b4 W Foo::impl::impl()
    0000000000000960 T Foo::method1()
    000000000000097e T Foo::method2()
    0000000000000910 T Foo::Foo()
    0000000000000910 T Foo::Foo()
    0000000000000942 T Foo::~Foo()
    0000000000000942 T Foo::~Foo()
                     U operator new(unsigned long)
    

    但是,声明 Foo::impl Foo_impl ,然后我们得到以下结果:

    0000000000201030 B __bss_start
                     w __cxa_finalize
    0000000000201030 D _edata
    0000000000201038 B _end
    000000000000088c T _fini
                     w __gmon_start__
    0000000000000668 T _init
                     w _ITM_deregisterTMCloneTable
                     w _ITM_registerTMCloneTable
                     w _Jv_RegisterClasses
                     U operator delete(void*)
    0000000000000820 T Foo::method1()
    000000000000083e T Foo::method2()
    00000000000007d0 T Foo::Foo()
    00000000000007d0 T Foo::Foo()
    0000000000000802 T Foo::~Foo()
    0000000000000802 T Foo::~Foo()
                     U operator new(unsigned long)
    

    所以看起来是的,可见性说明符实际上是对嵌套结构的支持。