如果我对头文件做了一些小改动,是否需要重新编译第三方库

时间:2014-06-20 16:02:23

标签: c++

我有第三方图书馆。这个库有一个类。此类将其所有数据成员声明为受保护。因为我需要从我自己的代码访问这个类的数据成员,所以我修改了#34; protected"公共"。

现在,我可以访问此第三方类的数据成员,而无需重新编译第三方库。

因此,我的结论是关键词如" public"," protected"和#34;私人"没有进入编译的代码。这些关键字的范围仅限于头文件。 我们可以改变私人"和#34;受保护"公共"公共"为了访问班级数据成员。

我的结论是对还是错?请帮忙。

2 个答案:

答案 0 :(得分:11)

  

如果我对头文件做了一些小改动,是否需要重新编译第三方库

是的,绝对。

访问规则仅在编译时应用,不会存在于已编译的可执行文件中。但是,它们会对您的类型的内存布局产生巨大影响,并且这种影响通过编译直接进入您的可执行文件并最终进入正在执行的计算机上的RAM中。

  

[C++11: 9.2/14]:分配具有相同访问控制(第11章)的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址。未指定具有不同访问控制的非静态数据成员的分配顺序(11)。 [..]

考虑到这一点,请考虑以下事项:

struct T
{
private:
   int x;
public:
   int y;
   int z;
};

未指明xy相对于彼此在内存中的显示方式,但z之后始终会找到y(因为它们共享)访问级别)。因此,编译器可能提出的一种可能的顺序是:

y z x

现在,如果您要更改x,那么它也是public

struct T
{
public:
   int x;
   int y;
   int z;
};

......不再允许先前的订购;实际上,现在只允许 排序:

x y z

看到类型布局的变化打破了二进制兼容性,这对编译的程序来说是一个非常重要的变化:至少,你必须重建整个项目;在最糟糕的情况下,就像在这里一样,它是一个库,所以你还必须增加你用来表示二进制接口更改的版本号(以防止可怕的访问冲突和难以发现的错误)并传播新的依赖于所有依赖项目。

无论如何,对第三方图书馆这样做似乎从一开始就闻起来。它有一个非常差的界面,不适合用途(在这种情况下,使用另一个或通过改进界面正确分叉),或者你做了一些可怕的错误。

答案 1 :(得分:0)

你在玩火! 所有投注都已关闭!这是未定义的行为:它可能会按预期工作,也可能会突袭你的冰盒。