【发布时间】:2015-06-16 13:38:19
【问题描述】:
我设法解决了这个问题,但我不明白为什么会这样,所以我只想对此进行澄清,欢迎任何解释。
我正在练习 Bruce Eckel 的书:用 C++ 思考。 第 1 卷第 4 章中的练习 13 正在创建“表示视频租赁商店中的录像带的抽象数据类型” 根据本章的主题,我假设这应该是一个结构,就像这个非常简单的:
//video.h
typedef struct {
unsigned id;
char* title;
float length;
int inRent;
void printout();
} Video;
使用虚拟实现,例如:
//video.cpp
#include "stdio.h"
#include "video.h"
void Video::printout(){
printf("id:%u, title:%s, length:%f\n",this->id,this->title,this->length);
}
还有这样的 main.cpp:
//main.cpp
#include "video.h"
#include "stdio.h"
int main(){
Video first;
first.id=1;
first.title="Some title";
first.length=1.5;
first.printout();
return 0;
}
当尝试编译和链接gcc -o main.exe main.cpp video.cpp -lstdc++ 时,我在链接时收到以下错误。我也用 g++ 得到了同样的结果
C:\Users\jani\AppData\Local\Temp\cc1KIhpp.o:main.cpp:(.text+0x2e): undefined reference to `Video::printout()'
当我使用结构标识符时 - 比如:typedef struct some_id {...} Video; - 编译并运行没有错误。
这种结构声明在类似情况下如何工作? Eckel 说:“你会注意到结构标识符在开始时被忽略了,因为目标是创建 typedef。但是,有时你可能需要在定义结构时引用它。(.. .)”。 这适用于哪些情况?
非常感谢您的回答。
亚诺斯
【问题讨论】:
-
我不认为 :: 对 c 有效,所以这不是 C++ 问题吗?
-
我假设顶部是 video.h,然后是 video.cpp,然后是 main.cpp?
-
是的,你是对的。 :: 对 C 无效但是 C++ 链接器会产生错误。 “ video.h,然后是 video.cpp,然后是 main.cpp?” - 是的,你是对的。
-
请就 typedef 结构声明提出建议,不要为包含头文件或编译/链接顺序而烦恼。如果您检查,最初的问题是为什么在“typedef struct”的情况下需要结构标识符才能成功链接。换句话说,为什么可以遵守和链接:
typedef struct something {...} Video;,这为什么不起作用:typedef struct {...} Video;