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

C++ 如果我对头文件做了一些小更改,是否需要重新编译第三方库,c++,C++,我有一个第三方图书馆。这个图书馆有一个班级。并且该类将其所有数据成员声明为受保护。因为我需要从自己的代码访问此类的数据成员,所以我将“protected”修改为“public” 现在我可以访问这个第三方类的数据成员,而无需重新编译第三方库 因此,我的结论是,诸如“public”、“protected”和“private”之类的关键字不会进入编译代码。这些关键字的范围仅限于头文件。 我们可以将“private”和“protected”更改为“public”,以便访问类数据成员 我的结论是对的还是错

我有一个第三方图书馆。这个图书馆有一个班级。并且该类将其所有数据成员声明为受保护。因为我需要从自己的代码访问此类的数据成员,所以我将“protected”修改为“public”

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

因此,我的结论是,诸如“public”、“protected”和“private”之类的关键字不会进入编译代码。这些关键字的范围仅限于头文件。 我们可以将“private”和“protected”更改为“public”,以便访问类数据成员


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

你在玩火!所有赌注都输光了!这是不明确的行为:它可能会像预期的那样工作,也可能会袭击你的冰箱

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

当然可以。

访问规则仅在编译时应用,不会在编译后的可执行文件中继续存在。然而,它们对您的类型的内存布局有着巨大的影响,这种影响通过编译、编译到您的可执行文件中,最终到执行计算机上的RAM中

[C++11:9.2/14]:
分配具有相同访问控制(第11条)的(非联合)类的非静态数据成员,以便以后的成员在类对象中具有更高的地址。未指定具有不同访问控制的非静态数据成员的分配顺序(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
看到类型布局的改变破坏了二进制兼容性,这对编译程序来说是一个巨大的改变:至少,你必须重建整个项目;在最坏的情况下,就像这里一样,它是一个库,因此您还必须增加用于表示二进制接口更改的版本号(以防止可怕的访问冲突和难以发现的错误),并将新的依赖关系传播到所有依赖项目


无论如何,对第三方库这样做从一开始就好像是一股气味。要么它有一个非常糟糕的接口,不适合使用(在这种情况下,使用不同的接口,或者通过改进接口来正确地使用它),要么你正在做一些可怕的错误

你通常不应该改变第三方的东西,是的,你需要重新编译!如果您将该类实例传递给第三方DLL,您将遇到问题
,因为我需要从自己的代码访问该类的数据成员,我已将“protected”修改为“public”
为什么不从该类派生您自己的类?然后所有的<代码>保护< /Cord>成员将在您的派生类中变得可用。@ PulcMcKeZie:并且作为C++,您可以将可变引用暴露给那些…code>protected不应用于数据成员。因此,它与
public
@PaulMcKenzie一样好。第三方代码返回的是第三方类对象。我无法访问此第三方对象的受保护成员。派生第三方类没有帮助。未定义的行为在哪里?@MichaelBurr:我试图鼓励这位作者在回答中解释这一点。现在它只是一个断言。根据标准,你是对的,但在实践中,我不知道有哪种编译器不按照声明的顺序排列成员,独立于访问。(但我还是不同意他的建议。你的最后一段写得很对。)