首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C文件中的外部空指针

C文件中的外部空指针
EN

Stack Overflow用户
提问于 2015-10-21 12:22:34
回答 2查看 2K关注 0票数 1

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

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

具体而言,情况如下:

program.c

代码语言:javascript
复制
#include "SDL.h"
int a;
SDL_Surface* sprite;
SDL_Surface* ghost;

unit.c

代码语言:javascript
复制
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

代码语言:javascript
复制
extern void* sprite;
extern void* ghost;

编译器没有抱怨。我只需要这些外部指针来测试它们是否指向相同的地址。我对这个可执行文件做了一点测试,它运行得很好。

我使用的是免费命令行Borland编译器ver5.5.1

问题是,这在ANSI C中是否是合法的,还是Borland编译器的一些古怪之处?是唯一真实(最佳实践)的解决方案,我的情况,包括SDL.h在单元.c或请您指出一些其他合法的选择?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-21 12:30:57

不,这是而不是的法律。可以将任何数据指针转换为void*,但不能假装现有指针是void*

解决方法是创建标头program.h,并将其包含到unit.c中。

代码语言:javascript
复制
#ifndef PROGRAM_H
#define PROGRAM_H
#include "SDL.h"
extern int a;
extern SDL_Surface* sprite;
extern SDL_Surface* ghost;
#endif

不要不惜一切代价避免将头文件包含到.c文件中;这是C中的一个标准实践,也是避免问题的最佳方法。

票数 1
EN

Stack Overflow用户

发布于 2015-10-21 12:26:14

在unit.c中没有定义SDL_Surface

添加

代码语言:javascript
复制
#include "SDL.h"

调至单位c

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33259219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档