是否有任何简单的方法(hack)来暴露前向声明隐藏的 header ?
Is there any easy way (hack) to expose a header hidden by forward declaration?
我知道这个问题听起来很傻...
我在一个使用大量 openssl 库的项目中工作。我目前正在努力将使用过的库从 1.0 升级到 1.1,这给了我很多困难。 Openssl 社区决定不再让任何人访问其 BIO、SSL、RSA、EVP_PKEY 的内部结构。这似乎是一个不错的方向,但我有数千行代码使用这些结构(例如 EVP_PKEY *key; key->reference = XXX;
)。
我注意到 openssl 通过前向声明隐藏了这些代码(即将 public header 分隔为 public header + 私有 header ).
例如,旧结构中的代码如下所示:
include/obj.h:
struct obj_st {
int property1, int property2 ....etc
}
新结构变成
include/obj.h:
struct obj_st;
include/obj_private.h:
struct obj_st {
int property1, int property2 ....etc
}
在这种情况下,我将整个openssl编译为静态库后。 #include<openssl/obj.h>
包含它的我的代码不再能够访问这些属性。
一个简单的处理方法是我将所有这些私有 header 文件移回原始格式(w/o 前向声明)。但这意味着我每次拉取新的openssl代码时都需要这样做
有没有什么简单的破解方法可以让它们再次暴露出来?我也在考虑在我的代码中包含私有 header(例如 #include<openssl/obj_private.h>
),但是许多私有 header 也依赖于其他 header,这结果我需要将所有 header 复制到我的 usr/include/openssl 文件夹中。我不确定这样做是否是个好主意....
简短版本:你不知道。
长版本: 库开发人员试图使 public API 尽可能狭窄和简单,同时隐藏实现细节是有一个重要原因的来自图书馆用户。原因是,不属于 API 的代码可能会在没有任何通知的情况下自由更改,只要维护 API 合同。
要点是,如果库开发人员决定隐藏以前暴露的东西(这本身就是一个非常强大的举动,我不知道,但我相信你),他们有认真的改变意图这段代码在未来很重要。如果他们在某个时候这样做,您的代码无论如何都会以最扭曲的方式中断(考虑到您愿意升级,我猜您会根据您的问题进行升级)-并且访问结构成员对您没有帮助。
因此,不幸的是,对您来说最好的行动方案是重构您的代码,以便使用不太方便的新代码 API。作为图书馆开发者 和 图书馆用户,对此我深感抱歉。
我知道这个问题听起来很傻...
我在一个使用大量 openssl 库的项目中工作。我目前正在努力将使用过的库从 1.0 升级到 1.1,这给了我很多困难。 Openssl 社区决定不再让任何人访问其 BIO、SSL、RSA、EVP_PKEY 的内部结构。这似乎是一个不错的方向,但我有数千行代码使用这些结构(例如 EVP_PKEY *key; key->reference = XXX;
)。
我注意到 openssl 通过前向声明隐藏了这些代码(即将 public header 分隔为 public header + 私有 header ).
例如,旧结构中的代码如下所示: include/obj.h:
struct obj_st {
int property1, int property2 ....etc
}
新结构变成 include/obj.h:
struct obj_st;
include/obj_private.h:
struct obj_st {
int property1, int property2 ....etc
}
在这种情况下,我将整个openssl编译为静态库后。 #include<openssl/obj.h>
包含它的我的代码不再能够访问这些属性。
一个简单的处理方法是我将所有这些私有 header 文件移回原始格式(w/o 前向声明)。但这意味着我每次拉取新的openssl代码时都需要这样做
有没有什么简单的破解方法可以让它们再次暴露出来?我也在考虑在我的代码中包含私有 header(例如 #include<openssl/obj_private.h>
),但是许多私有 header 也依赖于其他 header,这结果我需要将所有 header 复制到我的 usr/include/openssl 文件夹中。我不确定这样做是否是个好主意....
简短版本:你不知道。
长版本: 库开发人员试图使 public API 尽可能狭窄和简单,同时隐藏实现细节是有一个重要原因的来自图书馆用户。原因是,不属于 API 的代码可能会在没有任何通知的情况下自由更改,只要维护 API 合同。
要点是,如果库开发人员决定隐藏以前暴露的东西(这本身就是一个非常强大的举动,我不知道,但我相信你),他们有认真的改变意图这段代码在未来很重要。如果他们在某个时候这样做,您的代码无论如何都会以最扭曲的方式中断(考虑到您愿意升级,我猜您会根据您的问题进行升级)-并且访问结构成员对您没有帮助。
因此,不幸的是,对您来说最好的行动方案是重构您的代码,以便使用不太方便的新代码 API。作为图书馆开发者 和 图书馆用户,对此我深感抱歉。