我想对用户定义的类型使用extern
关键字。这意味着我在一个文件中声明了对象并在其他文件中定义了它。我已经读过extern关键字用于声明变量而不定义它。当程序被拆分为多个源文件并且每个都需要使用全局变量时,extern关键字很有用。如果我错了,请纠正我。
以下是我编写的程序,但不幸的是我做错了什么或遗漏了一些东西,所以我收到了编译错误。
Prog1.cpp
#include <iostream>
using std::cout;
class test
{
public:
void fun();
};
void test::fun()
{
cout<<"fun() in test\n";
}
test t;
Prog2.cpp
#include <iostream>
using std::cout;
extern test t;
int main()
{
t.fun();
}
现在我用
编译这两个 g++ -o prog1.cpp prog2.cpp
编译器在prog2.cpp中给出了以下错误
error: 'test' does not name a type
error: 't' was not declared in this scope
请帮助我知道我在这里做错了什么。
答案 0 :(得分:5)
extern
告诉编译器t
的定义在其他地方,但编译器仍然需要test
的定义,因为你正在使用t.fun()
编译 Prog2.cpp
。
所以解决方法是,在您定义类的地方写test.h
,然后像往常一样在test t
中定义Prog2.cpp
。在test.h
中加入Prog2.cpp
,以便了解test
的定义。然后建立它。
<强> test.h:强>
#include <iostream>
using std::cout;
class test //definition of test
{
public:
void fun()
{
cout<<"fun() in test\n";
}
};
<强> Prog1.cpp:强>
#include "test.h"
test t; //definition of t
<强> Prog2.cpp:强>
#include <iostream>
#include "test.h"
using std::cout;
extern test t; //the definition of t is somewhere else (in some .o)
//and the definition of test is in test.h
int main()
{
t.fun();
}
现在你的代码应该编译和链接。
请注意链接器在链接时需要t
的定义,因此它将在其他.o
文件中搜索它,但需要test
的定义编译器,在编译时。
现在显而易见的是,你可以将extern test t;
放在标题本身中,这样你就不必在每个.cpp
文件中写入它,你想要使用{{1}中定义的对象文件(由编译器转换为Prog1.cpp
)。
答案 1 :(得分:1)
将 extern 关键字放在标题中,而不是 cpp 文件中。 header 的工作是告诉编译器某处有外部定义的对象。
例如:
program.h (主要是声明)
struct UserDefinedType
{
void do_stuff();
};
// declare your global object in the header
// so that the compiler knows its name when
// compiling sources that can not otherwise see
// the object
extern UserDefinedType global_udt;
program.cpp (主要是定义)
#include "program.h"
// define the member functions here
void UserDefinedType::do_stuff()
{
}
// define the global object here
UserDefinedType global_udt;
main.cpp (使用标题中声明的定义)
#include "program.h" // tells the compiler about global_udt
int main()
{
// call the global object that is defined
// in a different source file (program.cpp)
global_udt.do_stuff();
}
注意:如果我们声明 标头文件中的对象global_udt
,那么 main.cpp 不会知道它的存在,如果我们试图使用它,编译器会抱怨。
所以标题只需声明对象而不是定义它因此需要 extern 关键字
答案 2 :(得分:0)
请注意,在类范围外声明的变量是具有外部链接的变量(如果未明确使用 static 关键字)或内部链接(如果静态关键字放在变量类型的左侧),如果要在多个文件中使用它,则需要 extern 。
假设此文件名为 MyVariable.h
int myNumber = 0; // Initialization of the variable myNumber, external linkage
static int myStaticNumber; // Initialization of the variable myStaticNumber, internal linkage(only the file in which it's declared)
此文件为 OtherFile.cpp
extern int myNumber; // Not a initialization because it's already initialized in another file, works fine
extern int myStaticNumber; // ERROR, this variable has internal linkage!!
你可能想知道为什么myStaticNumber被初始化而不是刚刚声明,因为 static 变量默认初始化为默认值。