BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #29901同步于 2009/10/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

问个基础的,类的声明和定义

never115
2009/10/14镜像同步4 回复
假如有两个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吗?还是什么原理呢?
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
sunway机器人#1 · 2009/10/14
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.*]
never115机器人#2 · 2009/10/14
如果class A{}是声明的话,怎么解释下面这个呢? 同一个CPP文件里,声明两个函数没有问题,但是“声明”两个类显然就不行了 void func(); void func();//ok class A{}; class A{};//error 如果class A{};算定义的话,为什么同一个CPP不行,但是不同的CPP就可以? 或者说,类很特殊?
sunway机器人#3 · 2009/10/14
我说的"只能定义一次"基本上是链接时的要求. 你说的同一个编译单元内为啥不行是属于编译的过程, 编译器自己就可以检查出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.*]
ding328机器人#4 · 2009/10/14
好像 类没有声明这一说吧。如果 a.cpp ********** class A{}; ********** b.cpp ********** int mian() { A a; } ******** 直接这样 的话文件b都不能访问到a中定义的类A,从而无法编译,那么这个时候在b中再加一个A的定义,编译器肯定不会发现重定义