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

[复制链接]
4152|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文件中使用的,因为只在最后链接时才会在所有被链接的模块中找一下这个函数是否被定义了。
古道热肠 发表于 2007-5-22 14:00 | 显示全部楼层

不做声明,链接会报警

    楼上说得对,编译时能通过,到了Link阶段会报警。
 楼主| 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);才行不知为啥?为什么以前可以用,现在不能用了。
andrew.xu 发表于 2007-5-22 16:30 | 显示全部楼层

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

您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

529

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部