C 忽略类型定义结构的显式强制转换
我想从我的API头中隐藏OpenSSLC 忽略类型定义结构的显式强制转换,c,casting,header,typedef,C,Casting,Header,Typedef,我想从我的API头中隐藏OpenSSLRSA结构要求,所以我做了: // 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//RSA结构 typedef RSA_密钥; RSA_密钥\u ptr获取RSA_密钥() { //返回RSA_new(); 返回(RSA_key_ptr)RSA_new(
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//RSA结构
typedef RSA_密钥;
RSA_密钥\u ptr获取RSA_密钥()
{
//返回RSA_new();
返回(RSA_key_ptr)RSA_new();
}
无效免费rsa密钥(rsa密钥ptr密钥)
{
//无RSA_(密钥);
无RSA_((RSA*)密钥);
}
我的问题是,每次我在api.c
中引用RSA
指针时,我都需要从RSA\u key\ptr
对RSA*
进行强制转换,以防止出现不兼容的指针类型警告
我想找到更优雅的方式:
你需要一个演员
struct RSA_key
是一种新类型,未由typedef RSA_key定义代码>。它是一个没有定义的无关结构的名称。您只能处理指向它的指针,并向它和从它转换其他结构指针
在隐藏实现细节方面,这是一种不错的技术(除了多余的typedef RSA\u密钥;
)。而且演员都是优秀的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; }
为什么要避免显式强制转换?它们增加了可读性。@Fredrik,嗯,我认为它实际上降低了可读性(至少对我来说是这样,但对于ofc来说,作为代码作者,我不是最好的评判者)。像这样的显式强制转换只用于隐藏程序中的bug或设计错误。您需要修复bug/设计错误,而不是强制转换。此外,在typedefs后面隐藏指针是非常糟糕的做法。
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; }