在c ++中全局定义结构

时间:2008-11-25 19:19:14

标签: c++ file structure global extern

有一个有点详细的线程(228684)关于如何全局(使用extern结构)声明一个可以在超过1个c ++文件中看到的结构,但我无法弄清楚到底是怎么做的(有一个很多关于这样做的讨论,做到这一点,也许这样做,尝试这个,等等......)。

有人请发一个非常简单的例子来说明如何声明一个可以在2个单独的c ++文件中看到的结构吗?如果我将所有函数放在与main相同的文件中,它可以正常工作,但是当我尝试将函数拆分为不同的文件时,我无法进行编译。

我不清楚的事情...... 我应该输入结构吗? 我是否在头文件中定义结构并在每个c ++源文件中包含该头? 我是否需要头文件中的#ifndef宏? 我是否在标题中声明了结构extern?

4 个答案:

答案 0 :(得分:7)

它被称为头文件。

在头文件中(称之为foo.h)

#ifndef FOO_H
#define FOO_H
class X {
};
#endif

然后,在任何C文件中

#include "foo.h"
X x;

对于C ++,使用class更常见/更受欢迎,但您也可以使用struct。 extern关键字通常是指变量,而不是类/结构声明。您可以在一个.cpp文件中的头文件中创建一个全局变量extern(然后将其声明为not-extern)。

答案 1 :(得分:3)

结构不能是外部的或静态的。如果要在两个以上的转换单元中使用结构,请将结构定义放入标题中:

foo.hpp

struct foo {
    int a;
    int b;
};

然后使用该结构将该头文件包含到所有源文件中。在多个源文件中定义struct / class / union是完全有效的,只要每个源文件定义相同即可。您可以在foo的定义周围添加Include Guard,以防止foo被包含两次到正在编译的同一源文件中。 (因此,在同一个程序中有多个foo是有效的,但在同一个源中有多个foo(注意:含义翻译单元)无效。)请参阅 3.2一个定义规则< / em>在C ++标准中或Draft

当你看到这个:

extern struct foo { int a; int b; } b;

foo不是extern,但b(对象)是extern!它说b没有定义,只是声明了,所以你可以引用它。

答案 2 :(得分:1)

如果你想要一个全局变量;可从多个编译单元(C ++文件)访问的单个结构:

/* foo.h */
#ifndef EXAMPLE_FOO_H
#define EXAMPLE_FOO_H

struct foo {
    int a;
    int b;
};

extern struct foo globalFoo;

#endif /* EXAMPLE_FOO_H */

-

/* foo.cpp */
#include "foo.h"

struct foo globalFoo = { 1, 2 };

-

/* bar1.cpp */
#include "foo.h"

int test1()
{
    int c = globalFoo.b; //c is 2
}

-

/* bar2.cpp */
#include "foo.h"

int test2()
{
    int x = globalFoo.a; //x is 1
}

foo.h中的“struct {}”行告诉编译器结构foo是什么样的。 “extern struct”行声明了一个名为“globalFoo”的特定struct foo,它带有外部链接。 (可以结合这两个声明,请参阅@ litb的答案。)这意味着globalFoo(bar1 / test1和bar2 / test2)的用户将在其他地方查找结构,它们将没有自己的单独副本。 / p>

foo.cpp是定义globalFoo的特例。任何变量只能有一个定义,在这种情况下,foo.cpp具有globalFoo的定义。当bar1和bar2在外部寻找globalFoo时,他们会找到foo.cpp的globalFoo。该名称将引用所有三个文件中相同的实际结构。

如果extern没有出现,那么所有三个.cpp文件都会有一行读取“struct foo globalFoo;” (请记住,#include只是复制/粘贴)这将[尝试]创建三个具有相同名称的不同结构,从而导致混乱。

注意:在foo.cpp的情况下,“extern struct foo globalFoo;”行是多余的,但这并不重要。

答案 3 :(得分:0)

这是一个小例子:

#ifndef __my_header__
#define __my_header__

class my_class
{

};

#endif

my_class将在包含此标头的任何文件中可见。我认为你的问题还有其他问题,但我不太明白。