有一个有点详细的线程(228684)关于如何全局(使用extern结构)声明一个可以在超过1个c ++文件中看到的结构,但我无法弄清楚到底是怎么做的(有一个很多关于这样做的讨论,做到这一点,也许这样做,尝试这个,等等......)。
有人请发一个非常简单的例子来说明如何声明一个可以在2个单独的c ++文件中看到的结构吗?如果我将所有函数放在与main相同的文件中,它可以正常工作,但是当我尝试将函数拆分为不同的文件时,我无法进行编译。我不清楚的事情...... 我应该输入结构吗? 我是否在头文件中定义结构并在每个c ++源文件中包含该头? 我是否需要头文件中的#ifndef宏? 我是否在标题中声明了结构extern?
答案 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
将在包含此标头的任何文件中可见。我认为你的问题还有其他问题,但我不太明白。