在c ++中使用extern关键字作为用户定义的类型

时间:2015-05-29 16:48:37

标签: c++ extern

我想对用户定义的类型使用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

请帮助我知道我在这里做错了什么。

3 个答案:

答案 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 变量默认初始化为默认值。