隐式参数强制转换

时间:2012-07-11 22:36:04

标签: c

我有一个以下列方式工作的C代码:标题包含函数的声明,例如:

typedef struct MyStruct
{
    int thing;
    void* reserved;
} MyStruct;

void foo(MyStruct* bar);

然后,在我的.c代码中,我有这个:

typedef struct EXTENDED
{
    float more_stuff;
} EXTENDED;

struct MyStructEx
{
    int thing;
    EXTENDED* ex;
} MyStructEx;

void foo(MyStructEx* bar)
{
    ...
}

这在MSVC下编译正常(警告告诉我标题和实现参数不匹配)但Code :: Blocks(GCC)会抛出错误。有没有办法让这个错误无声或者至少让它成为一个警告,或者我是唯一可以在标题中加入额外定义的选项?

我这样做是因为我在C中编写了一个模块化库,所以有时候各个组件需要“临时空间”才能工作(这是标题中保留的void *),并避免有一堆我试图隐含地将通用MyStruct结构转换为更专业的结构。

所以我的问题是,我应该使用哪个选项将此类错误更改为警告,和/或是否有更好的方法来实现此目的? (我需要使用标准C)。

2 个答案:

答案 0 :(得分:3)

保留函数原型并将指针强制转换为函数定义

typedef struct EXTENDED
{
    float more_stuff;
} EXTENDED;

struct MyStructEx
{
    int thing;
    EXTENDED* ex;
} MyStructEx;

void foo(MyStruct* bar)
{
    MyStructEx *mse = (MyStructEx*)bar;
    ...
}

它将关闭编译器。

答案 1 :(得分:1)

MyStruct*MyStructEx*之间没有隐式转换。

(一个术语狡辩:没有“隐式演员”这样的东西。演员表是一个显式转换,使用强制类型名称组成的强制转换操作符。)

也无法保证void*EXTENDED*具有相同的尺寸和代表性;例如,void*为8个字节,EXTENDED*为4个字节,这将是完全合法的。

任何假定MyStructMyStructEx具有相同布局的技术都会导致程序的行为未定义。

似乎foo函数需要MyStruct*foo函数需要MyStructEx*两个不同的函数,有两个不同的名称。其中一个可以是另一个的包装。

或者,您可以删除MyStructEx类型,并使用MyStruct代替所有内容,foo()进行必要的转换。