我正在制作一个程序,我已经决定分裂成两个.c文件。第一个program.c文件包含所有的包含文件和声明,而另一个unit.c文件有12个函数,以及主程序c中定义的全局变量的一些外部声明。
到目前为止,一切都很正常(编译/链接),在unit.c中声明和在program.c中定义的外部变量都是类型为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)
....
}如果我把SDL.h放在unit.c的顶部,问题就解决了,但是我不想把所有的东西都包括进去,所以我想出了一个圆形的解决方案。我只在unit.c中声明sprite和鬼怪的类型为void指针,但program.c中的定义保持不变。就像这样:
unit.c
extern void* sprite;
extern void* ghost;编译器没有抱怨。我只需要这些外部指针来测试它们是否指向相同的地址。我对这个可执行文件做了一点测试,它运行得很好。
我使用的是免费命令行Borland编译器ver5.5.1
问题是,这在ANSI C中是否是合法的,还是Borland编译器的一些古怪之处?是唯一真实(最佳实践)的解决方案,我的情况,包括SDL.h在单元.c或请您指出一些其他合法的选择?
发布于 2015-10-21 12:30:57
不,这是而不是的法律。可以将任何数据指针转换为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中的一个标准实践,也是避免问题的最佳方法。
发布于 2015-10-21 12:26:14
在unit.c中没有定义SDL_Surface。
添加
#include "SDL.h"调至单位c
https://stackoverflow.com/questions/33259219
复制相似问题