定义结构全局在C + +

问题描述 投票:1回答:4

有一个较详细的线程(228684)关于如何(使用的extern结构)宣布,可能会超过1和C ++文件中看到的结构在全球范围内,但我无法弄清楚究竟是如何做到这一点(有很多的讨论关于这样做,这样做,也许做到这一点,试试这个,等...)。

couuld有人请张贴的如何声明,可以在2个独立的C ++文件中可以看出一个结构非常简单的例子?如果我把我所有的功能在同一个文件为主要它工作正常,但是当我尝试在不同的文件进行分割的功能,我不能得到它的编译。

事情我就不清楚......我应该的typedef结构?做我定义在头文件的结构,并包括在每个C ++源文件,该文件首部?我需要在头文件中的#ifndef宏?难道我宣布在头结构的extern?

c++ file structure global extern
4个回答
7
投票

这就是所谓的头文件。

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

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

然后,在任何C文件你有

#include "foo.h"
X x;

对于C ++中更常见/优先使用类,但你可以使用结构为好。 extern关键字一般是指变量,而不是类/结构的声明。你会做一个头文件中的全局变量的extern在你的.cpp文件之一(当时宣称它不-EXTERN)。


3
投票

结构不能extern或static。如果你想在两个以上的翻译单元使用的结构,把结构定义放入头:

foo.hpp

struct foo {
    int a;
    int b;
};

然后,包括头文件到使用该结构的所有的源文件。在具有多个源 - 文件中定义的结构/类/联合是完全有效的,只要每一个都是相同的定义。你可以把Include Guard围绕foo的定义,以防止FOO包括两次踏入同的资源文件正在编制。 (因此,在同样的程序具有多个foo是有效的,但在相同的源(注意具有多个foo:意为翻译单元)是无效的。)请参阅3.2一定义规则在C ++标准或Draft

当你看到这一点:

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

不是foo是EXTERN,但b(对象)是的extern!它说,b没有定义,而仅仅是声明的,因此你可以参考它。


2
投票

如果你想有一个全局变量;单个结构体从多个编译单元访问(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中的“结构{}”行告诉编译器FOO的外观结构等。在“外部结构”行声明称“globalFoo”具有外部链接的特定结构FOO。 (有可能这两个声明的结合,看到@ litb的答案。)这意味着是globalFoo(BAR1 / TEST1和BAR2 / TEST2)的用户将寻找结构的其他地方,他们不会有自己独立的副本。

Foo.cpp中是定义globalFoo的特殊情况。只能有任何变量的一个定义,在这种情况下Foo.cpp中有globalFoo的定义。当BAR1和BAR2寻找globalFoo“外,”他们会发现Foo.cpp中的globalFoo。该名称将指向同一个实际的结构在所有三个文件。

如果extern没有去过那里,则所有三个.cpp文件将具有读取一条线“结构FOO globalFoo;” (请记住,#包括只是复制/粘贴),将[企图]创建三个不同的结构具有相同的名称,造成一片混乱。

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


0
投票

这里有一个小例子:

#ifndef __my_header__
#define __my_header__

class my_class
{

};

#endif

my_class将在包括该头的任何文件可见。我认为有别的东西你的问题,虽然,但我不太明白。

© www.soinside.com 2019 - 2024. All rights reserved.