我想在我的API标头中隐藏OpenSSL RSA
结构要求,所以我这样做了:
// api.h
typedef struct RSA_key * RSA_key_ptr;
RSA_key_ptr get_rsa_key();
void free_rsa_key(RSA_key_ptr key);
// api.c
#include <openssl\rsa.h> // RSA struct
typedef RSA RSA_key;
RSA_key_ptr get_rsa_key()
{
//return RSA_new();
return (RSA_key_ptr)RSA_new();
}
void free_rsa_key(RSA_key_ptr key)
{
//RSA_free(key);
RSA_free((RSA*)key);
}
我的问题是,每次我引用RSA
中的api.c
指针时,都需要从RSA*
到RSA_key_ptr
进行强制转换,以防止 不兼容的指针类型 警告。
我想找到更优雅的方式:
答案 0 :(得分:1)
您需要演员表。 struct RSA_key
是一种新类型,未被typedef RSA RSA_key;
定义。它是没有定义的不相关结构的名称。您只能处理指向它的指针,并向其投射其他结构指针。
隐藏实现细节(除非多余的typedef RSA RSA_key;
)不是一个坏技术。并且演员表是良好的标准C。
如果您发现自己在强制转换表达式周围需要太多括号的情况下,那么小的实用程序函数或宏可能会有助于缓解这种情况:
static inline RSA* as_rsa(struct RSA_key* rsa_key)
{ return (RSA*)rsa_key; }
static inline struct RSA_key* as_rsa_key(RSA* rsa_key)
{ return (struct RSA_key*)rsa_key; }