用于创建库的标头是否必须与使用库的标头相同

时间:2013-02-13 22:48:55

标签: c++ static-libraries object-slicing

在将源代码编译为.o文件并使用“ar rcs libMyLibrarylib.a * .o”来创建库之​​后我得到了段错误,因为我使用的是带有成员变量和私有函数的头文件。当我使用完全相同的标题时,我没有得到错误。删除地图中的指针时会发生段错误。

标头用于创建lib

#include <**Type**>
class A
{
   public:
    A();
    ~A(); //In the destructor I iterate through the map to free everything before
    void function();
   private:
    void privateFunction();
    std::map<**Type**, int*> myMap;
}
与编译库一起使用的

标头
class A
{
   public:
    A();
    ~A();
    void function();
}

没有使用确切的头文件时是否有切片或其他内容?我想隐藏任何使用lib的 Type 的#include。

我对库进行了单元测试,它不会出现段错误,但它使用与编译它时相同的头文件。

2 个答案:

答案 0 :(得分:6)

这是一个不正确的程序,你正在遇到未定义的行为。程序中的翻译单元的类定义必须完全相同 - 根据 3.2一个定义规则[basic.def.odr] \ 6

要隐藏Type的包含,您可以使用PIMPL惯用语而不是诉诸于这些类型的黑客。

class AImpl;
class A
{
   public:
    A();
    ~A(); //In the destructor I iterate through the map to free everything before
    void function();
   private:
    AImpl* pImpl;
}

您只需将所有逻辑和数据成员移动到AImpl中,并使公共接口尽可能保持干净。您所需要的只是AImpl的前瞻声明。

答案 1 :(得分:1)

在客户端代码中,您的对象具有不同的大小。当在堆栈中或堆中分配对象时,这将覆盖内存。