在这种情况下,海湾合作委员会可见性会有什么作用



我正在写一个库:用户将使用一些符号,而另一些符号是内部烹饪。我开始在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_linksm_offsets。如果我添加了可见性的属性,那意味着什么?说不同的是,当我将 TATO_SYM_INTERNAL添加到m_links时,海湾合作委员会会做什么?

第三,隐藏已删除的成员函数的可见性是否意味着什么?

首先,internal可见性略有危险。考虑使用hidden可见性,哪个更安全。

可见性标志确定链接器是否可以看到符号。如果图书馆外的某人试图调用allocate方法,则他们会收到链接器错误,就好像没有实现该方法一样。如果您真的不希望局外人调用该方法,这可能很好,但是链接器错误通常比编译器错误更令人困惑。最好将该方法标记为"私有"(如果可能的话),这将为您的用户提供更好的错误消息体验。

由于m_linksm_offsets已经是私有的,因此无法提供外部代码。更重要的是,它们没有链接器符号,因此没有什么可隐藏的。应用此属性将无效。

对于您的复制构造函数(例如,删除的成员函数)也是如此。这些函数在任何地方都没有实现(它们不能),因此它们没有链接器符号,因此可见性属性无能为力。

最新更新