我正在制作一个程序,我决定分成两个.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中,还是请您指出其他合法的替代方案?
答案 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