Применяется ли __attribute __ ((visibility ("default"))) к вложенным структурам? - PullRequest
0 голосов
/ 24 августа 2018

Когда я пишу классы на C ++ и использую идиому Pimpl, я обычно устанавливаю структура так выглядит:

Foo.hpp

class Foo
{
public:
    Foo();
    ~Foo();


    void method1();
    void method2();

private:
    struct impl;
    std::unique_ptr<impl> p;
};

foo.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 {...};

Мой вопрос: применим ли атрибут видимости к методам? вложенной структуры impl и делает все члены видимыми или они остаются скрытыми.

1 Ответ

0 голосов
/ 24 августа 2018

Проверяя код с помощью "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)

так что похоже, что да, спецификатор видимости действительно распространяется на вложенные структуры.

...