关于C++头文件与cpp文件的疑问

http://www.cnblogs.com/laojie4321/archive/2012/03/30/2425015.html
我从上面的网站中看到这么一段话
如果在头文件中实现一个函数体,那么如果在多个C文件中引用它,而且又同时编译多个C文件,将其生成的目标文件连接成一个可执行文件,在每个引用此头文件的C文件所生成的目标文件中,都有一份这个函数的代码,如果这段函数又没有定义成局部函数,那么在连接时,就会发现多个相同的函数,就会报错
然后我自己测试了一下,在一个项目内建立了aaa.cpp,bbb.cpp,ccc.h这三个文件,
在ccc.h中写
class A
{
int a;
void f(){}
};
然后在bbb.cpp和aaa.cpp文件中都包括了这个头文件,发现并没有出错,这是怎么回事?
第二个测试:
我在ccc.h文件中写
class A
{
static int a;
};
int A::a=9;
然后在aaa.cpp和bbb.cpp文件中都包括这个头文件,发现出错了,但是如果我去掉
ccc.h文件中的“int A::a=9;”这一行代码后再编译,发现并没有出错,
或者再新建立一个ddd.cpp文件中写到
#include"ccc.h"
int A::a=9;
同时去掉ccc.h文件中的“int A::a=9;”这一行代码后再编译,发现并没有出错,
这是怎么回事?
第三个测试:
一个全局变量不能在多个CPP文件中重复定义,但是一个类可以在多个CPP文件中重复定义
我在aaa.cpp文件中写
class M
{
int a;
void g(){}
};
在bbb.cpp文件中写
class M
{
double a;
void f(){}
};
编译后发现都没出错,这又是怎么回事?

5个回答

你那个不是全局变量,是类的成员变量。
另外重复包含一个类的定义肯定会出错,不知道你说的不出错是什么意思,你有没有真正把它们添加到项目中。

jekxi
Yuan-w 不出错就是编译正常通过,我有真正把它们添加到项目中
5 年多之前 回复

include相当于把头文件放在包含指令的位置。

你两个不同的源代码文件定义重名的类,这个可以。
定义方法和全局变量不可以。

有什么问题?

jekxi
Yuan-w 而且不同的源代码文件可以定义重名的类,那么为什么在第二个测试中,我在ccc.h文件中写 class A { static int a; }; int A::a=9; 然后在aaa.cpp和bbb.cpp文件中都包括这个头文件,两个源文件中的static int a占用不同的内存,这样就通过编译了吧,可是结果还是出错了
5 年多之前 回复
jekxi
Yuan-w 而且不同的源代码文件可以定义重名的类,那么为什么在第二个测试中,我在ccc.h文件中写 class A { static int a; }; int A::a=9; 然后在aaa.cpp和bbb.cpp文件中都包括这个头文件,两个源文件中的static int a占用不同的内存,这样就通过编译了吧,可是结果还是出错了
5 年多之前 回复
jekxi
Yuan-w 定义方法是什么意思?
5 年多之前 回复

方法就是函数,
返回值 函数名(参数) { 函数体 }
变量就是
类型 变量名
类就是
class 类名 { ... };
明白?

楼主没有学过c吧,一个是面向对象一个是面向过程的,不一样的,c++有函数重载,名字相同不会报错的,c不一样的,我刚刚看完c正在看c++也不是很清楚,可以参考一下这个http://bbs.csdn.net/topics/390679710,

这是重复包含的问题,头文件中要使用宏来防止重复包含!
#ifndef xxx_xx_h
#define xxx_xx_h
class A
{
public:
void fun()
{
}
}
#endif // end of xxx_xx_h
另外,静态成员要在.h文件申明,在cpp中初始化!不然就会在多个obj文件中重复包含!
让类的定义在.h文件 , 实现在cpp文件 ,这样才符合正常的编码规范!不要全部挤在一起!

ltm5180
李天明 回复jekxi: 不可以,在一个项目中有同名的类,那么需要通过namespace命名空间来区分!
5 年多之前 回复
jekxi
Yuan-w 多个源文件可以定义相同的名字的类是吧?,并且这些同名的类在不同的源文件中可以有不同的成员,也就是说虽然在多个源文件中虽然有重名的类,但是编译器依然把他们当作不同的类?
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐