返回信息流假如有两个CPP文件
//a.cpp
int a;
class A
{
public:
A(){}
void print(){};
};
//b.cpp
int a;
class A
{
public:
A(){}
void print(){};
};
int main()
{
return 0;
}
1、编译会对int a说重定义的错误,为什么对类不会呢?类有声明和定义一说吗?看过好多书,好像也没看到过有相关的解释诶,都是说要在.h里声明/定义(不太清楚.h里的是算声明还是定义),然后在.cpp里再实现什么的(这个实现算定义吗?)
2、用的VC6.0,对于两个cpp里面重复定义的变量,第一次编译说重定义,再编译一次就通过了,这是bug吗?还是什么原理呢?
这是一条镜像帖。来源:北邮人论坛 / cpp / #29901同步于 2009/10/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
问个基础的,类的声明和定义
never115
2009/10/14镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
one definition rule..即声明多次,定义一次
c++里, int a是定义, extern int a是声明, class A {};算是声明吧, A a是定义.
void foo();是声明,void foo() {}是定义;
class A {};可以有函数定义,但这些函数自动是inline的,在elf里,inline函数(不管是否成功inline)都有weak属性, 可以多次定义
【 在 never115 (竹马) 的大作中提到: 】
: 标 题: 问个基础的,类的声明和定义
: 发信站: 北邮人论坛 (Wed Oct 14 14:33:19 2009), 站内
:
: 假如有两个CPP文件
: //a.cpp
: int a;
: class A
: {
: public:
: A(){}
: void print(){};
: };
: //b.cpp
:
: int a;
: class A
: {
: public:
: A(){}
: void print(){};
: };
: int main()
: {
: return 0;
: }
:
: 1、编译会对int a说重定义的错误,为什么对类不会呢?类有声明和定义一说吗?看过好多书,好像也没看到过有相关的解释诶,都是说要在.h里声明/定义(不太清楚.h里的是算声明还是定义),然后在.cpp里再实现什么的(这个实现算定义吗?)
: 2、用的VC6.0,对于两个cpp里面重复定义的变量,第一次编译说重定义,再编译一次就通过了,这是bug吗?还是什么原理呢?
:
: --
:
: ※ 来源:·北邮人论坛 http://forum.byr.edu.cn·[FROM: 219.142.180.*]
如果class A{}是声明的话,怎么解释下面这个呢?
同一个CPP文件里,声明两个函数没有问题,但是“声明”两个类显然就不行了
void func();
void func();//ok
class A{};
class A{};//error
如果class A{};算定义的话,为什么同一个CPP不行,但是不同的CPP就可以?
或者说,类很特殊?
我说的"只能定义一次"基本上是链接时的要求.
你说的同一个编译单元内为啥不行是属于编译的过程, 编译器自己就可以检查出A重复了,
至于为什么函数不报错而类声明就报错,难道是因为类声明一般比较长.....不好比较两个声明是否一样? 毕竟类声明确实不太一样,它也定义了一种类型
【 在 never115 (竹马) 的大作中提到: 】
: 标 题: Re: 问个基础的,类的声明和定义
: 发信站: 北邮人论坛 (Wed Oct 14 14:49:21 2009), 站内
:
: 如果class A{}是声明的话,怎么解释下面这个呢?
: 同一个CPP文件里,声明两个函数没有问题,但是“声明”两个类显然就不行了
: void func();
: void func();//ok
:
: class A{};
: class A{};//error
: 如果class A{};算定义的话,为什么同一个CPP不行,但是不同的CPP就可以?
: 或者说,类很特殊?
: --
:
: ※ 修改:·never115 于 Oct 14 14:51:57 修改本文·[FROM: 219.142.180.*]
: ※ 来源:·北邮人论坛 http://forum.byr.edu.cn·[FROM: 219.142.180.*]
好像 类没有声明这一说吧。如果
a.cpp
**********
class A{};
**********
b.cpp
**********
int mian()
{
A a;
}
********
直接这样 的话文件b都不能访问到a中定义的类A,从而无法编译,那么这个时候在b中再加一个A的定义,编译器肯定不会发现重定义