Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 忽略类型定义结构的显式强制转换_C_Casting_Header_Typedef - Fatal编程技术网

C 忽略类型定义结构的显式强制转换

C 忽略类型定义结构的显式强制转换,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(

我想从我的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//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; }