***VC中重复定义的错误

SKJG 2003-10-30 09:58:41
有一个VC++ Console的工程
有CC.h AA.cpp AA.h Main.cpp 四个文件
Main函数在Main.cpp中

四个文件的内容如下
//CC.h
#ifndef __CC_H__
#define __CC_H__
void Foo()
{
}
#endif


//AA.h
#ifndef __AA_H_
#define __AA_H_
class AA
{
.....
};
#endif

//AA.cpp
#include "AA.h"
#include "CC.h
....


//Main.cpp
#include "AA.h"
#include "CC.h"

int main()
{
return 0;
}

在VC6.0中编译时,编译器给出Foo重复定义的错误,
请教各位,该问题如何解决!!!!
最好是各个文件的代码部分不要修改
不要加入新的文件
...全文
139 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sham2k 2003-10-31
  • 打赏
  • 举报
回复
应该是连接报的错。
编译AA.cpp时产生一份foo.
编译Main.cpp时有产生一份foo.
解决方法就是CC.h只包含Foo的声明,新建CC.cpp里面放入Foo函数体定义
别无更简单的方法。

而且本来就该这么做!!!

你对宏的理解有错。宏的作用范围只限于定义宏的那个程序文件。如果一个程序文件啊A #include另外一个程序文件B,则B定义的宏在A也起作用。

编译AA.cpp时,包含CC.h,编译器其发现__CC_H__没有定义,于是包含编译CC.h的内容
产生一份foo.

编译Main.cpp时,包含CC.h,编译器其发现__CC_H__还没有定义,于是包含编译CC.h的内容
又产生一份foo.

尽管编译AA.cpp时,包含CC.h后,定义了__CC_H__,编译AA.cpp结束,这个定义的作用域就结束了,不会保持定义到编译其他的块,因此编译Main.cpp时,__CC_H__还没有定义呢。

#ifndef 保证一个源程序块不会多次包含同一个头文件,不能保证整个程序中只包含一个头文件。因此头文件中只能申明宏,内联函数,函数申明,不能定义函数。

如果你不想将CC.h分隔成两个文件,可以修改将foo修改成inline函数。当然如果foo()很小的话这样做是可以的。否则,最好拆成两个文件。
aflyinghorse 2003-10-30
  • 打赏
  • 举报
回复
//AA.cpp
#include "AA.h"
#include "CC.h //这里包含

//Main.cpp
#include "AA.h"
#include "CC.h" //这里包含

你的CC.h包含了两次,而Foo的定义在CC.h,所以会有重定义错误

解决方法是CC.h只包含Foo的声明,新建CC.cpp里面放入Foo函数体定义
fierygnu 2003-10-30
  • 打赏
  • 举报
回复
没问题。是编译错还是连接错?
sakurar 2003-10-30
  • 打赏
  • 举报
回复
#ifdef
如果宏有定义的话....
#ifndef
如果宏没有定义的话....
#endif
与#if、#ifdef、#ifndef等成对儿圈定域


要防止这样的问题发生,没有什么“特效”的办法。只能是注意自己的书写习惯。
一般来说,程序头文件中必段要通过#ifdef之类的防止被重复连接。
也可以用#pragma once之类的编译器开关来确保头文件只被包含一次。
类型、函数的声明一律放在头文件中,而实现一律不得放在头文件中。
多用函数与类型的前置声明,而尽量不要让头文件相互连接。






SKJG 2003-10-30
  • 打赏
  • 举报
回复
那位大虾能够详细的介绍一下#ifdef #ifndef #endif等预处理指令吗???
他们到底有什么作用??????????????????
好迷茫!!!!!
snooper1001 2003-10-30
  • 打赏
  • 举报
回复
void Foo()
{
}
改为
static void Foo()
{
}
或者
inline void Foo()
{
}
SKJG 2003-10-30
  • 打赏
  • 举报
回复
那位大虾能够详细的介绍一下#ifdef #ifndef #endif等预处理指令吗???
好迷茫!!!!!
carbon107 2003-10-30
  • 打赏
  • 举报
回复
什么也不让改,不能改正了啊
SKJG 2003-10-30
  • 打赏
  • 举报
回复
为什么预处理指令不起作用呢???
#ifndef __CC_H__
#define __CC_H__
....
#endif //有作用吗??
如果有作用的话,错误不是重复定义,而是没有定义!!!
请各位大虾指教!!
SKJG 2003-10-30
  • 打赏
  • 举报
回复
为什么预处理指令不起作用呢???
#ifndef __CC_H__
#define __CC_H__
....
#endif //由作用吗??
如果有作用的话,错误不是重复定义,而是没有定义!!!
请各位大虾指教!!
sham2k 2003-10-30
  • 打赏
  • 举报
回复
应该是连接报的错。
编译AA.cpp时产生一份foo.
编译Main.cpp时有产生一份foo.
解决方法就是CC.h只包含Foo的声明,新建CC.cpp里面放入Foo函数体定义
别无更简单的方法。

而且本来就该这么做!!!
fierygnu 2003-10-30
  • 打赏
  • 举报
回复
我看错了。。。
这样不行。只要有一个.cpp文件包含了CC.h,Foo就有了一个实现,所以你的AA.cpp和main.cpp里都有一个Foo,当然就重定义了。
把Foo函数的实现放到AA.cpp或者Main.cpp里都行,CC.h里只保留原型声明就可以了。
SKJG 2003-10-30
  • 打赏
  • 举报
回复
有没有不添加文件的解决方法????

我的CC.h有如下的预处理指令
#ifndef __CC_H__
#define __CC_H__
....
#endif
为什么还会被包含多次?????

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧