鱼C论坛

 找回密码
 立即注册
查看: 7722|回复: 17

为什么我用了#ifndef却还是提醒重复定义???

[复制链接]
发表于 2014-2-15 19:12:38 | 显示全部楼层 |阅读模式
1鱼币
我在编多文件程序时,在其中console.h头文件中加上了
#ifndef CONSOLE_H
#define CONSOLE_H
……
#endif
然后在GameFunc.cpp和PointFunc.cpp中都使用了console.h,但是在编译时提醒了console.h中的函数在GameFunc.obj中重复定义,用#pragma once也不行,只有在函数前加上static才可以,但是这样做会增大可执行文件,怎样才能解决这种问题???


我的编译器是VS2010专业版

最佳答案

查看完整内容

简单说:头文件基本没什么变化(基本就是说还是有那么一点点变化的), 然后有2种做法: (1)把你的所有.cpp文件生成一个.lib文件---这就是静态库 (1)把你的所有.cpp文件生成一个.dll文件+1个.ib文件---这就是动态库 基本概念就是这样,具体的你可以看msdn或者上网搜下 VC6 静态库 动态库 有很多入门级的教程的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-15 19:12:39 | 显示全部楼层

简单说:头文件基本没什么变化(基本就是说还是有那么一点点变化的),
然后有2种做法:
(1)把你的所有.cpp文件生成一个.lib文件---这就是静态库
(1)把你的所有.cpp文件生成一个.dll文件+1个.ib文件---这就是动态库

基本概念就是这样,具体的你可以看msdn或者上网搜下  VC6   静态库  动态库  
有很多入门级的教程的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-15 20:32:56 | 显示全部楼层
我只是路过打酱油的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-16 13:32:30 | 显示全部楼层
本帖最后由 oggplay 于 2014-2-16 14:04 编辑

我看别人都是这样:
#ifndef CONSOLE_H
#define CONSOLE_H 1
#pragma
........
#endif


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-2-19 14:31:54 | 显示全部楼层
oggplay 发表于 2014-2-16 13:32
我看别人都是这样:
#ifndef CONSOLE_H
#define CONSOLE_H 1

没用,同时使用#ifndef和#pragma once会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-19 18:32:11 | 显示全部楼层
学习一下  路过。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-27 17:08:18 | 显示全部楼层
求十枚鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-27 20:09:33 | 显示全部楼层
按理说你这样就行了呀……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-3 17:23:44 | 显示全部楼层
myisland 发表于 2014-2-27 20:09
按理说你这样就行了呀……

就是啊,我也是很疑惑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-4 01:04:47 | 显示全部楼层
这个真不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-4 04:46:48 | 显示全部楼层
还要根据源码的报错再分析一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-4 19:35:41 | 显示全部楼层
因为头文件中智能申明函数,不能定义函数(定义函数只能在.c文件中)。你在头文件里定义了函数,所以报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-5 14:56:07 | 显示全部楼层
仰望天上的光 发表于 2014-3-4 19:35
因为头文件中智能申明函数,不能定义函数(定义函数只能在.c文件中)。你在头文件里定义了函数,所以报错

谢谢,我已经懂了,我已经把函数定义部分改到了cpp文件中
但是还有一个问题,如果希望像微软一样创建一个自己的函数库,使得每次使用函数都只用包含一个头文件,应该怎样编写头文件?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-7 10:37:17 | 显示全部楼层
仰望天上的光 发表于 2014-3-6 10:12
简单说:头文件基本没什么变化(基本就是说还是有那么一点点变化的),
然后有2种做法:
(1)把你的所有 ...

谢谢帮助,斑竹英明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-7 10:38:33 | 显示全部楼层
仰望天上的光 发表于 2014-3-6 10:12
简单说:头文件基本没什么变化(基本就是说还是有那么一点点变化的),
然后有2种做法:
(1)把你的所有 ...

还有,在模板中用的包含模型可以用在这种普通函数中吗??为什么包含模型在模板中可用,但是不能用于普通函数呢???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-9 19:55:39 | 显示全部楼层
隐袭战龙 发表于 2014-3-7 10:38
还有,在模板中用的包含模型可以用在这种普通函数中吗??为什么包含模型在模板中可用,但是不能用于普通 ...

C++中的inline函数是可以直接定义在头文件中的,C++中的函数模板也是可以直接定义在头文件中的。他们和普通函数的区别在于:普通函数在编译(非链接)的时候,只是作语法检查,如函数名,参数个数,参数类型等,此时并不要求知道函数的定义(这是链接时期的事情)。
inline函数用于取代C中的宏,,在编译时期,函数的定义就要被直接“嵌入”到调用处。所以,编译时期必须知道函数的定义(不然你怎么嵌入呢?),所以inline函数的定义必须出现在.h文件中。
函数模板,本身是模板,不是函数,是用来生成函数的一个东西。在编译时期,要根据第哦啊用函数模板的地方,推断出类型参数,并根据函数模板产生函数。此时要产生函数,必须能够见到函数模板的定义(不然就没法产生)。所以,函数模板的定义也要出现在.h文件中,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-10 16:57:08 | 显示全部楼层
仰望天上的光 发表于 2014-3-9 19:55
C++中的inline函数是可以直接定义在头文件中的,C++中的函数模板也是可以直接定义在头文件中的。他们和普 ...

谢谢斑竹,斑竹威武:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-10 18:38:23 | 显示全部楼层
来看看是什么........:funk:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 21:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表