有一个较详细的线程(228684)关于如何(使用的extern结构)宣布,可能会超过1和C ++文件中看到的结构在全球范围内,但我无法弄清楚究竟是如何做到这一点(有很多的讨论关于这样做,这样做,也许做到这一点,试试这个,等...)。
couuld有人请张贴的如何声明,可以在2个独立的C ++文件中可以看出一个结构非常简单的例子?如果我把我所有的功能在同一个文件为主要它工作正常,但是当我尝试在不同的文件进行分割的功能,我不能得到它的编译。
事情我就不清楚......我应该的typedef结构?做我定义在头文件的结构,并包括在每个C ++源文件,该文件首部?我需要在头文件中的#ifndef宏?难道我宣布在头结构的extern?
这就是所谓的头文件。
在你的头文件(称之为foo.h中)
#ifndef FOO_H
#define FOO_H
class X {
};
#endif
然后,在任何C文件你有
#include "foo.h"
X x;
对于C ++中更常见/优先使用类,但你可以使用结构为好。 extern关键字一般是指变量,而不是类/结构的声明。你会做一个头文件中的全局变量的extern在你的.cpp文件之一(当时宣称它不-EXTERN)。
结构不能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
没有定义,而仅仅是声明的,因此你可以参考它。
如果你想有一个全局变量;单个结构体从多个编译单元访问(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中的情况下,多余的,但是,这并不重要。
这里有一个小例子:
#ifndef __my_header__
#define __my_header__
class my_class
{
};
#endif
类my_class
将在包括该头的任何文件可见。我认为有别的东西你的问题,虽然,但我不太明白。