请帮助我〜:)
代码complie在visual studio上成功。但是,在代码中无法编译linux,g ++。
代码..
A.H
struct Test { Test(); ~Test(); };
B.h
extern struct Test { Test(); ~Test(); };
A.cpp
#include "A.h"
Test::Test()
{
cout << "Construction" << endl;
}
Test::~Test()
{
cout << "Destruction" << endl;
}
B.cpp
#include "B.h"
strcut A_Test : Test { A_Test(); ~A_Test(); };
当我在linux上编译代码时。我在描述中遇到了错误。
“只能为对象和函数指定存储类”
这个代码在linux上有什么问题?
谢谢你,所有人都理解我的傻瓜英语。
答案 0 :(得分:4)
Test
是一种数据类型,因此您无需使用extern
。正如错误消息所示,extern
仅适用于函数和对象。如果Visual Studio允许您的代码进行编译,那么这就是编译器中的“错误”。
extern
的要点是告诉编译器不要担心它看不到的函数和对象,因为它们已在别处定义(这些将由链接器解析)。这对数据类型没有意义;编译器需要知道数据类型,以便生成正确的目标代码。
答案 1 :(得分:0)
外部使用的示例是
a.cpp
struct test myObj;
b.cpp
extern struct test myObj;
extern意味着编译器不会做任何事情,它会使该符号为未定义,它只是让它留给链接器完成其余的工作,记住当你编译b.cpp时给-c选项gcc, - c选项确保代码仅编译而不是链接,如下所示
g ++ -c b.cpp / *这将生成b.o * /
并编译主文件,如下所示
g ++ b.o a.cpp