编译包含标头中声明的函数的源文件

时间:2012-08-15 13:03:12

标签: c++ class compiler-construction g++ forward-declaration

假设有一个源文件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’

为什么编译器不将employee作为外部符号(就像它需要先前声明但未定义的符号)并编译un2.cpp文件。

编译普通的未定义符号和未定义的类之间有什么区别吗? 任何人都可以告诉我(如果可能的话),只需转发声明一个类并在其中定义符号的方式?

3 个答案:

答案 0 :(得分:3)

external用于链接器,在编译代码时不会帮助你,因为编译器只通过编写前向声明就不知道你的类声明。

相反,您需要在un2.cpp文件中包含带声明的标头才能进行编译。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

关键是一个类没有用符号表示,但必须知道完整的类结构才能生成代码。首先,编译器需要类定义来检查类employee是否确实包含一个名为setname的成员函数,该函数使用string并返回void(如果它没有&# 39; t,编译器必须返回错误)。此外,您将要访问函数内部类的其他成员(调用其他成员函数或访问数据成员),因此您需要声明那些,这是类定义的一部分。在链接时,类名完全消失(调试信息除外,作为成员函数符号和虚拟表的一部分)。

通常在为头文件编写实现文件时,应该在实现文件中包含头文件。这将确保您拥有定义在那里声明的所有内容所需的一切,此外还测试头文件,前提是您在实现文件中首先将其包含在内。