免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10818 | 回复: 12

[函数] 小弟请教一个关于头文件中定义函数,在编译时出现重复定义的问题 [复制链接]

论坛徽章:
0
发表于 2006-08-30 10:25 |显示全部楼层
各位,小弟请教一个关于头文件中定义函数,在编译时出现重复定义的问题
小弟发现在头文件中加入于预编译控制

#ifndef ***
#define ***
……
#endif

只能防止变量的重复定义错误,而不能保证函数的重复定义错误,
比较郁闷

小弟写了一段测试程序,各位大大帮忙看看

1。head.h

#ifndef __HEAD__
#define __HEAD__
int e;
int i(){
        printf("%d\n",e);
        return e;
}
#endif

2. head1.c

#include <stdio.h>
#include "head.h"
extern int j();
main(){
        e=0;
        e++;
        i();
        j();
}

3. head2.c

#include <stdio.h>
#include "head.h"
int j(){
        printf("%d\n",e);
        return e;
}

gcc head1.c head2.c 出现如下错误
/tmp/ccLzdy1P.o(.text+0x0): In function `i':
: multiple definition of `i'
/tmp/ccurivKz.o(.text+0x0): first defined here
collect2: ld returned 1 exit status

在head.h 中的int i()前加上  static 可以避免该问题,但不想这样用

还有在c++的类定义时,如果把类定义和成员函数实现都写在头文件里的话,多次引用该头文件也会出现同上面类型相同的错误

论坛徽章:
0
发表于 2006-08-30 10:31 |显示全部楼层

  1. 2. head1.c

  2. #include <stdio.h>
  3. [color=Red]//#include "head.h"   已经用了一次了,再用一次没问题吧!![/color]
  4. extern int i();
  5. extern int j();
  6. main(){
  7.         e=0;
  8.         e++;
  9.         i();
  10.         j();
  11. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2006-08-30 10:33 |显示全部楼层
你说的非常对。
所以,人们一般不会在头文件中书写函数的实现,或者类实现。
这也就是“头文件”为什么被称作是“头文件”的原因。
如果 .h 和 .c 在用途/用法上没有区别的话,我们就不会用两个不同的扩展名来区分它们了。

论坛徽章:
0
发表于 2006-08-30 10:41 |显示全部楼层
谢谢楼上两位老大
关于2楼老大说的“已经用了一次了,再用一次没问题吧”,前面在代码上加上预编译控制就是为了防止你说的问题

3楼老大教育的很对,但现在小弟碰到的情况是从网上down了一个读写excel文件的头文件CSpreadSheet.h,它就是把类定义和成员函数实现写在一起的,而我又把它包含在一个头文件里,包含它的头文件又被多次引用,所以报错,就是想问问不修改CSpreadSheet.h原来的实现方法,有什么办法可以解决问题。

还有就是链接的时候问什么会出现这个问题,也就是说预编译控制为什么不管用

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2006-08-30 10:42 |显示全部楼层
你既然都已经知道 #if defined 只是“预编译控制”了,
那还指望它在“链接”的时候管用?

论坛徽章:
0
发表于 2006-08-30 10:47 |显示全部楼层
小弟还是不明白,那为什么对变量的定义就有效那

论坛徽章:
0
发表于 2006-08-30 11:44 |显示全部楼层
头文件里只写声明,定义在c文件里写.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2006-08-30 12:58 |显示全部楼层
原帖由 zhangjiakouzf 于 2006-8-30 10:47 发表
小弟还是不明白,那为什么对变量的定义就有效那

对变量的定义也有问题,你 -Wall 一把试试?

论坛徽章:
0
发表于 2006-08-30 13:26 |显示全部楼层
好像明白一点楼上大哥说的意思了,先谢过,等完全明白了再贴上来

论坛徽章:
0
发表于 2006-08-30 15:23 |显示全部楼层
原帖由 zhangjiakouzf 于 2006-8-29 18:47 发表
小弟还是不明白,那为什么对变量的定义就有效那


变量定义也不行的,所以需要加上extern关键字,声明这个变量,而在别处(可能是某个.c文件)定义它。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。




----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP