2012-08-15 63 views
0

假设声明的函数有一个源文件un2.cpp编译包含在报头中

----un2.cpp---- 

class employee; 
void employee::setname(string s) 
{ 
.....(some code) 
} 

Employee类在un2.h定义,其中的setName()被声明一个源文件。 现在,当我试图通过“CC -c un2.cpp -o un2.o”编译un2.cpp,我得到一个错误消息

un2.cpp:3:16: error: invalid use of incomplete type ‘struct employee’ 
un2.cpp:1:7: error: forward declaration of ‘struct employee’ 

为什么不编译器只是把员工作为外部符号(就像它需要一个先前声明但未定义的符号)并编译un2.cpp文件。

编译一个普通的未定义符号和一个未定义的类是否有区别? 也有人可以告诉我(如果有可能),只是前进的方式声明一个类,并在其中定义的符号?

+0

您是否将#include un2.h插入到cpp文件中? – sizzzzlerz 2012-08-15 13:10:25

+0

不......如果我包含.h文件,预处理器会将它复制到.cpp文件中,并且不会有外部符号来讨论。这将像一个正常的编译一切定义。 – avinash 2012-08-15 14:33:15

回答

3

外部是链接器,并且在编译代码时不会帮助您,因为编译器不会通过编写前向声明来了解类声明。

相反,您需要在un2.cpp文件中包含具有声明的头文件以编译。

2

您没有将该文件包含在该类的声明中。前向声明在这里没有帮助,因为编译器不知道类是否包含这种方法。

包含头文件,错误应该消失。

2

问题是一个类不是由符号表示的,但是完整的类结构必须为代码生成而知道。首先,编译器需要类定义来检查employee类是否确实包含一个名为setname的成员函数,其取string并返回void(如果没有,则编译器必须返回错误)。此外,您需要访问函数内的其他成员(调用其他成员函数或访问数据成员),因此您需要声明这些成员,这些成员是类定义的一部分。在联系时,类名完全消失(调试信息除外,并作为成员函数和虚拟表的符号的一部分)。

通常,当为一个头文件写一个实现文件时,应该在头文件中包含实现文件。这将确保您拥有定义在那里声明的所有内容所需的所有内容,此外还可以测试头文件,只要您将其作为实现文件中的第一件事物就可以了。

相关问题