C90转换为基础抽象类型

时间:2012-12-05 15:53:15

标签: c89 splint

依赖于日志记录相关功能的日志记录结构如下所示:

typedef struct 
{
    TFkt_vlogf vlogf;
    TFkt_outf outf;
    void* logData;
} TLogger;

在此日志记录功能中,有一个抽象的logData,根据记录器的作业分配不同的指针。

Filelogger会在某一时刻访问存储的文件句柄。

FILE * fileHandle = (FILE *)(logger->logData);

虽然这个编译SPLint对此不满意并抱怨这条消息:

转换为基础抽象类型FILE *(FILE *)(logger->logData)

我可以做些什么来满足SPLint?

  • 我试着撒了一些/*@abstract@*/,但没有帮助

C90中是否有更好的方法来存储和访问数据,同时仍然保持结构签名能够独立于其实现传递类型?

1 个答案:

答案 0 :(得分:0)

更好的解决方案是使用联合并在该联合中包含所有可能的数据。

typedef union
{
    FILE * fileHandle;
    char something;
    long int other;
} TLog_data;

typedef struct 
{
    TFkt_vlogf vlogf;
    TFkt_outf outf;
    TLog_data logData;
} TLogger;

在执行期间的某个时刻,您将使用:

((TLogger*) logger)->logData.fileHandle