编译一个源文件,其中包含在标头中声明的函数

compiling a source file which contains a function declared in a header

本文关键字:包含 声明 函数 一个 源文件 编译      更新时间:2023-10-16

>假设有一个源文件 un2.cpp

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

雇员类在 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 文件。

编译普通的未定义符号和未定义的类有什么区别吗?还有谁能告诉我(如果可能的话),转发声明一个类并定义其中的符号的方法?

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

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

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

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

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

通常,在为标头编写实现文件时,应在实现文件中包含标头文件。这将确保您拥有定义在那里声明的所有内容所需的一切,除此之外,如果您将其作为实现文件中的第一件事,则还可以测试头文件。