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

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

概述我有一个第三方图书馆.这个库有一个类.此类将其所有数据成员声明为受保护.因为我需要从我自己的代码访问这个类的数据成员,所以我将“protected”修改为“public”. 现在,我可以访问此第三方类的数据成员,而无需重新编译第三方库. 因此,我的结论是“公共”,“受保护”和“私人”等关键词不会进入编译代码.这些关键字的范围仅限于头文件. 我们可以将“private”和“protected”更改为 我有一个第三方图书馆.这个库有一个类.此类将其所有数据成员声明为受保护.因为我需要从我自己的代码访问这个类的数据成员,所以我将“protected”修改为“public”.

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

因此,我的结论是“公共”,“受保护”和“私人”等关键词不会进入编译代码.这些关键字的范围仅限于头文件.
我们可以将“private”和“protected”更改为“public”以访问类数据成员.

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

解决方法

Do I need recompile third party librarIEs if I make a small change to the header file

是的,一点没错.

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

[C++11: 9.2/14]: Non-static data members of a (non-union) class with the same access control (Clause 11) are allocated so that later members have higher addresses within a class object. The order of allocation of non-static data members with different access control is unspecifIEd (11). [..]

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

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

关于x和y如何相对于彼此出现在内存中是未指定的,但是z将始终在y之后找到(因为它们共享访问级别).因此,编译器可能提出的一种可能的顺序是:

y z x

现在,如果您要更改x以使其也是公共的:

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

……不再允许以前的订购;实际上,现在唯一允许的排序是:

x y z

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

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

总结

以上是内存溢出为你收集整理的c – 如果我对头文件做了一些小改动,是否需要重新编译第三方库全部内容,希望文章能够帮你解决c – 如果我对头文件做了一些小改动,是否需要重新编译第三方库所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1218069.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存