导出的类具有非导出的数据成员

时间:2018-03-13 09:36:49

标签: c++ shared-libraries visibility

我希望有一个共享库foo导出一个类Foo。作为实现细节,我们假设Foo有一个类Detail的私有数据成员,我不想公开。

问题1:是否可以导出具有非导出类型的私有数据成员的类?

(我的理解:是)

我正在使用g++ -c -fPIC -o foo.o foo.cpp编译以下代码:

/* foo.h */

#pragma once
#define FOO_API   __attribute__((visibility("default")))
#define FOO_LOCAL __attribute__((visibility("hidden")))

class FOO_LOCAL Detail {

};

class Foo {
    Detail d_;
};

/* foo.cpp */

#include "foo.h"

// nothing

在Ubuntu 16.04 64bit上的gcc 4.6.0下,我收到以下警告:

foo.h:8:7: warning: ‘Foo’ declared with greater visibility than the type of its field ‘Foo::d_’ [-Wattributes]
 class Foo {
   ^

问题2:警告为什么?

我确实理解Foo的可见性高于其数据成员Foo::d_的类型:这是故意的。但为什么警告?是gcc过于热心,还是我的代码存在真正的潜在问题?

如果我将Foo的声明更改为:

class FOO_API Foo {
    Detail d_;
};

然后警告消失,但没有任何变化:Foo仍然具有比Foo::d_更高的可见度。

问题3:如果没有FOO_API的警告,为什么不会发出FOO_API的警告?

(注意:我知道这也是使用-fvisibility=hidden进行编译的一个选项。在这样做时我没有收到任何警告。但是在这个问题中,我假设我们编译没有{{ 1}})

0 个答案:

没有答案