C文件中的extern void指针

时间:2015-10-21 12:22:35

标签: c

我正在制作一个程序,我决定分成两个.c文件。第一个program.c文件包含所有包含文件和声明,另一个unit.c文件包含十几个函数和一些在主程序中定义的全局变量的外部声明。

一切正常(编译/链接)到目前为止,在unit.c中声明并在program.c中定义的extern变量属于类型为int或float的构建。当我试图从program.c中包含的头文件中使用新类型的变量而不是在unit.c中时,编译器通常会抱怨。

具体情况是这样的:

program.c

#include "SDL.h"
int a;
SDL_Surface* sprite;
SDL_Surface* ghost;

unit.c

extern int a; //works fine
extern SDL_Surface* sprite; //compiler error
extern SDL_Surface* ghost; //compiler error
void funct1 (void)
{
    if (sprite == ghost)
    ....
}

如果我在unit.c的顶部包含SDL.h,问题就解决了,但我不想把所有东西都包括在内,所以我想出了一个圆形的解决方案。我已经声明sprite和ghost只在unit.c中是void类型的指针,但program.c中的定义保持不变。像这样:

unit.c

extern void* sprite;
extern void* ghost;

编译器没有抱怨。我只需要那些外部指针来测试它们是否指向同一个地址。我对可执行文件进行了一些测试,并且工作正常。

我正在使用免费命令行Borland编译器ver 5.5.1

问题是,这可以在ANSI C中被认为是合法的还是Borland编译器的一些怪癖? 对于我的情况,唯一真正的(最佳实践)解决方案是将SDL.h包含在unit.c中,还是请您指出其他合法的替代方案?

2 个答案:

答案 0 :(得分:1)

不,它合法。你可以任何数据指针转换为void*,但你不能假装现有指针为void*

解决方法是创建标题program.h,并将其包含在unit.c

#ifndef PROGRAM_H
#define PROGRAM_H
#include "SDL.h"
extern int a;
extern SDL_Surface* sprite;
extern SDL_Surface* ghost;
#endif

不要试图避免不惜一切代价将标题包含在.c文件中;它是C语言中的标准练习,也是避免问题的最佳方法。

答案 1 :(得分:0)

SDL_Surface未在unit.c中定义。

添加

#include "SDL.h"

到unit.c