如何使好友功能具有内部链接 我需要确保一个C++函数,它声明为某个C++类的朋友,具有内部链接。

如何使好友功能具有内部链接 我需要确保一个C++函数,它声明为某个C++类的朋友,具有内部链接。,c++,linker,friend,C++,Linker,Friend,我之所以需要函数成为朋友,是因为它需要访问该类的私有成员,一个缓存函数结果的私有成员 函数需要是同一类的非成员(或至少不是实例成员)的原因是其他代码需要能够获取指向它的非成员函数指针。重构这将是太昂贵了 我之所以需要它具有内部链接,是因为将有很多这样的函数,而且在AIX上,这些函数太多会导致链接时TOC溢出错误。使用-bbigtoc链接器开关可以克服这一问题,但我目前正试图避免这种情况 另外,我希望能够将类声明保留在头文件中,但将函数本身放在包含实现的.cxx文件中 总而言之,现在我有这样的想法

我之所以需要函数成为朋友,是因为它需要访问该类的私有成员,一个缓存函数结果的私有成员

函数需要是同一类的非成员(或至少不是实例成员)的原因是其他代码需要能够获取指向它的非成员函数指针。重构这将是太昂贵了

我之所以需要它具有内部链接,是因为将有很多这样的函数,而且在AIX上,这些函数太多会导致链接时TOC溢出错误。使用
-bbigtoc
链接器开关可以克服这一问题,但我目前正试图避免这种情况

另外,我希望能够将类声明保留在头文件中,但将函数本身放在包含实现的.cxx文件中

总而言之,现在我有这样的想法:

class Foo
{
    private:
        mutable Qux cachedBarResult;
    // ... more code here ...
    public:
        friend const Qux & Bar(const Foo &);
};

const Qux & Bar(const Foo & foo)
{
    if (foo.cachedBarResult.isEmpty())
    {
        foo.cachedBarResult = _worker_Bar(foo);
    }
    return foo.cachedBarResult;
}

static Qux _worker_Bar(const Foo & foo)
{
    // real Bar work
}

我想使
具有内部链接。可以这样做吗?

是的,在你说它是朋友之前,你只需要声明静态函数的原型

class Foo;
static const Qux & Bar(const Foo & foo);

class Foo
{
    private:
        mutable Qux cachedBarResult;
    // ... more code here ...
    public:
        friend const Qux & Bar(const Foo &);
};


static const Qux & Bar(const Foo & foo)
{
    if (foo.cachedBarResult.isEmpty())
    {
        foo.cachedBarResult = _worker_Bar(foo);
    }
    return foo.cachedBarResult;
}

听起来很简单,但是我担心当声明了
Foo
的头文件(但是
Bar
没有定义)包含在某个.cxx文件中时,转发声明会做什么,而不是定义了
Bar
的头文件。链接器是否会抱怨声明为未定义的静态函数?