我有一个以下列方式工作的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)。
答案 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个字节,这将是完全合法的。
任何假定MyStruct
和MyStructEx
具有相同布局的技术都会导致程序的行为未定义。
似乎foo
函数需要MyStruct*
和foo
函数需要MyStructEx*
两个不同的函数,有两个不同的名称。其中一个可以是另一个的包装。
或者,您可以删除MyStructEx
类型,并使用MyStruct
代替所有内容,foo()
进行必要的转换。