0

我是 Linux、Windows 和 osX 上的 c++ 库的开发人员。由于 osX 现在不能正确处理匿名异常,我考虑清楚地标记需要导出的符号。按照这些解释,我定义了两个宏:FOO_APIFOO_LOCAL用于标记符号。现在我有以下问题:

我在自己的文件中定义每个类(因为我不想要 1000 多个长文件)。如果类A只在我的库中使用,那么用 . 标记它是有意义的FOO_LOCAL。但是如果 classB有一个私有成员 type A,而 class Bis FOO_API,那么我会收到编译器警告并且链接失败(找不到符号)。这似乎违背了这些出口属性的全部意义。那么,它应该是什么?我用类似这样的东西来标记我的班级class FOO_LOCAL A {...}是这样吗?

还有没有办法让所有私人成员都在本地?(因为它们是私有的,所以不应该直接访问它们)这将使标记过程不那么乏味......

最后,当我标记例如我的异常类时,它可以正确编译和运行,但显示符号 ( nm -C -D my_lib.so) 表明所有符号仍然存在......

4

1 回答 1

1

您可以使用pimpl 习惯用法向公众隐藏 API 类的库内部实现(因此在链接库时)。

某某 喜欢:

B.hpp:

class BImpl;

class FOO_API B
{
public:
    // Public stuff
    B();
    ~B();

    void foo();
private:
    BImpl* bimpl;
};

B.cpp:

#include "B.hpp"
#include "A.hpp"

struct BImpl
{
    void foo()
    {
        // Do something with 'a'
    }

    A a;
};

B::B()
: bimpl(new BImpl())
{
}

B::~B()
{
    delete bimpl;
}

void B::foo()
{
    bimpl->foo();
}
于 2012-09-19T18:02:48.840 回答