我正在写一个库:一些符号是供用户使用的,还有一些是内部烹饪的。我在 GCC wiki 的这个页面之后开始使用可见性属性,但我不太清楚该属性在某些情况下的作用:
#define TATO_SYM_INTERNAL __attribute__((visibility("internal")))
#define TATO_SYM_PUBLIC __attribute__((visibility("default")))
struct linkset
{
public:
typedef sentence::id * iterator;
typedef const sentence::id * const_iterator;
TATO_SYM_PUBLIC linkset() ;
TATO_SYM_INTERNAL void allocate( const datainfo & _datainfo );
TATO_SYM_PUBLIC void addLink( sentence::id _a, sentence::id _b );
TATO_SYM_PUBLIC bool areLinked( sentence::id _a, sentence::id _b ) const;
TATO_SYM_PUBLIC std::pair<const_iterator, const_iterator> getLinksOf( sentence::id _a ) const;
private:
typedef std::vector<sentence::id> linksArray;
linksArray m_links;
std::vector< std::pair<size_t, size_t> > m_offsets;
private:
TATO_SYM_INTERNAL linkset( const linkset & ) = delete;
TATO_SYM_INTERNAL linkset & operator=( const linkset & ) = delete;
};
inline
void linkset::addLink( sentence::id _a, sentence::id _b ) TATO_RESTRICT
{
// internal stuff
}
首先,用户没有理由打电话allocate()
。成员函数没有记录,它只是为了我的乐趣。在这种情况下,隐藏符号是否有意义?
第二,m_links
和m_offsets
。如果我为它们添加可见性属性,这意味着什么?换句话说,当我添加TATO_SYM_INTERNAL
到 m_links 时,GCC 会做什么?
第三,隐藏已删除成员函数的可见性是否意味着什么?