省略类型定义结构的显式转换

时间:2019-04-30 08:12:20

标签: c casting header typedef

我想在我的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进行强制转换,以防止 不兼容的指针类型 警告。

我想找到更优雅的方式:

  1. 避免显式强制转换
  2. 避免警告

1 个答案:

答案 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; }