我希望有一个共享库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}})子>