打印

为什么在头文件里面加入以下语句找不到所要调用的子函数??

[复制链接]
3319|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xzhenggen|  楼主 | 2007-5-22 08:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么在头文件里面加入以下语句(pulse.h)
#ifndef  _PULSE_H
#define  _PULSE_H
.
.
extern void CheckPulseData2(void);
.
.
#endif
时另一个C文件想调用它里面的子程序时反而找不到,出现错误报警.
如果直接在pulse.h头文件里面加入void CheckPulseData2(void);
去掉以下语句
#ifndef  _PULSE_H
#define  _PULSE_H
.
.
#endif
反而没事,我现在怀疑如果不用上面语句会不会出现意想不到的问题.
如果想用则另外的C文件想调用另一个C文件里面的子函数却找不到,这是怎么回事?

相关帖子

沙发
古道热肠| | 2007-5-22 10:20 | 只看该作者

头文件给出定义,C文件给出实现

   头文件中引入伪定义,控制重复说明,很专业的做法
   _PULSE_H这个符号只能在整个项目中用一次,如果你在其它文件中定义了,编译时就会忽略下面的函数说明语句
   #ifndef XXXX
       extern void CheckPulseData2(void);
   #endif

   通俗说就是:
    如果XXXX还未定义,则extern void CheckPulseData2(void);插入到当前C文件中参与编译。
    如果XXXX已经存在,下面的东西都忽略。

使用特权

评论回复
板凳
andrew.xu| | 2007-5-22 10:40 | 只看该作者

不要加extern

使用特权

评论回复
地板
infree| | 2007-5-22 13:49 | 只看该作者

extern加不加是无所谓的

函数声明和定义时默认就是extern的。
LS所说的现象让人无法理解,因为这个头文件中的函数声明实际上不是一个必须的步骤,即使不声明这个函数,只要这个函数所在的C文件会被编译和链接,这个函数仍是可以在其它C文件中使用的,因为只在最后链接时才会在所有被链接的模块中找一下这个函数是否被定义了。

使用特权

评论回复
5
古道热肠| | 2007-5-22 14:00 | 只看该作者

不做声明,链接会报警

    楼上说得对,编译时能通过,到了Link阶段会报警。

使用特权

评论回复
6
xzhenggen|  楼主 | 2007-5-22 14:19 | 只看该作者

一个C文件里面的函数想调用另一个C文件里面的子函数

原先在项目里面采用#include "pulse.h"原先我都一直在头文件里面这样定义使用:#ifndef  _PULSE_H
#define  _PULSE_H
.
.
extern void CheckPulseData2(void);
.
.
#endif
现在加入了新的C文件后,编译时能通过,到了Link阶段会报警。生成不了hex文件,只好去掉以下语句
#ifndef  _PULSE_H
#define  _PULSE_H
.
.
#endif
及去掉extern语句。直接在头文件里面加入void CheckPulseData2(void);才行不知为啥?为什么以前可以用,现在不能用了。

使用特权

评论回复
7
andrew.xu| | 2007-5-22 16:30 | 只看该作者

删除debug下的所有文件,让他重新来一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

529

帖子

1

粉丝