使用C ++文件中的C头文件中的Extern变量

时间:2012-12-21 00:58:07

标签: c++ c extern

我有一个用C语言编写的库。在库中有一个我需要使用的变量 在foo.h(在C中)

extern mystruct foobar;

在bar.h中(使用C ++) 我有以下课程。

#include foo.h

class myfoo { 

private:
   mystruct foobar;
}

我想知道的是,如果我创建一个myfoo数组,foobar的每个实例都会引用相同的变量,或者每个实例都是它自己独立于其他myfoo foobar的myfoo实例吗? / p>

3 个答案:

答案 0 :(得分:5)

以下是此交易:您foo.h使用foobar的{​​{1}}变量 <(特别是{1}} < em>声明 bar.h,定义必须在实现文件中)。相反,您将在类的范围内重新声明具有相同名称和类型的变量。

这样,实例成员变量的所有常规规则都适用。特别是,foo.h的每个实例都有自己的foobar实例。

如果您从myfoo删除了声明,则不会发生任何变化:声明与您的foobar文件完全无关。

答案 1 :(得分:3)

foobar类定义中的myfoo成员定义在与全局范围内foobar不同的范围内。它们是不同的变量,彼此无关,除了它们属于同一类型,并且碰巧具有相同的名称(尽管在不同的范围内)。

如果您创建一个myfoo个对象数组,则每个对象都会有mystruct个实例。所有这些实例都将与全球范围内声明的实例分开。

答案 2 :(得分:0)

  

我想知道的是,如果我创建一个myfoo数组,每个都是   foob​​ar的实例引用相同的变量,或者每个变量   实例是它自己独立的myfoo的唯一实例化   来自其他myfoo foobars?

如果你这样做:

#include foo.h

class myfoo 
{ 
private:
    mystruct foobar;
};

void func()
{
    myfoo f[3];
    // ...
}

您创建了3个不同的 myfoo 对象,每个对象都有自己的 foobar 实例。

如果您按如下方式更改myfoo声明:

#include foo.h

class myfoo 
{
private:
   static mystruct foobar;
};

// this extra declaration is required for 
// static member variables
mystruct myfoo::foobar;

void func()
{
    myfoo f[3];
    // ...
}

然后 myfoo的三个实例将共享他们的foobar单个实例。

注意

class myfoo声明可以是“.h”或“.cpp”文件。

mystruct myfoo::foobar;声明只能出现一次,因此它通常必须位于“.cpp”文件中(或“.cc”或您使用的任何内容)。