编译一个源文件,其中包含在标头中声明的函数
compiling a source file which contains a function declared in a header
>假设有一个源文件 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
(如果没有,编译器必须返回错误)。此外,您需要访问函数内类的其他成员(调用其他成员函数或访问数据成员),因此您将需要这些成员的声明,它们是类定义的一部分。在链接时,类名完全消失(调试信息除外,以及作为成员函数符号的一部分和虚拟表)。
通常,在为标头编写实现文件时,应在实现文件中包含标头文件。这将确保您拥有定义在那里声明的所有内容所需的一切,除此之外,如果您将其作为实现文件中的第一件事,则还可以测试头文件。
相关文章:
- 包含的类类型显然没有声明,为什么?
- 如果 x.h 仅由函数声明组成,为什么有必要在 x 中包含 x.h.cpp
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 我包含了<winuser.h>,但编译器在MonitorFromWindow上抛出"未声明"
- 即使不包含其标头,如何成功向前声明的类编译?
- 包含文件中的 Typdef "未在此范围内声明"
- 程序只适用于包含(无副作用)cout声明
- 循环包含依赖项/转发声明
- 我收到未声明的标识符错误,但我已包含头文件?
- 如何声明包含整数数组的对象
- 我需要在不使用前向声明的情况下相互包含两个头文件,导致"incomplete type"错误
- 我需要声明一个包含整数向量的 4x4 矩阵
- 错误: 包含 <Kinect.h> 时未声明"_Out_"
- 为什么我们可以创建一个模板类结构,其中包含许多与声明结构时指定的参数不同的参数
- 如何声明包含结构的类的成员函数
- 在声明时,向前斜线或后斜线包含在C 上
- 如何在不包含 Windows.h 的情况下获取 IsDebuggerPresent 的声明
- 缺少定义错误可以通过只包含声明来解决
- 互惠友元成员函数=循环包含声明
- CMake 正则表达式匹配包含声明中的标头名称