1

关于如何全局(使用 extern struct)声明一个可以在超过 1 个 c++ 文件中看到的结构,有一个有点详细的线程(228684),但我不知道该怎么做(有很多讨论关于做这个,做那个,也许做这个,试试这个,等等......)。

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

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

4

4 回答 4

7

It's called a header file.

in your header file (call it foo.h)

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

Then, in any C files you have

#include "foo.h"
X x;

For C++ it's more common/preferred to use class, but you can use struct as well. The extern keyword generally refers to variables, not class/struct declarations. You would make a global variable extern in a header file (then declare it not-extern) in one of your .cpp files.

于 2008-11-25T19:21:31.097 回答
3

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

foo.hpp

struct foo {
    int a;
    int b;
};

然后使用该结构将该头文件包含到所有源文件中。在多个源文件中定义结构/类/联合是完全有效的,只要每个源文件定义相同。您可以在 的定义周围放置一个Include Guardfoo ,以防止 foo 被两次包含到正在编译的同一源文件中。(因此,foo在同一个程序中有多个是有效的,但foo在同一个源中有多个(注意:意思是翻译单元)是无效的。)请参阅C++ 标准或草案中的3.2 一个定义规则

当你看到这个:

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

不是foo外部的,而是b(对象)是外部的!就是说b没有定义,只是声明,所以你可以参考它。

于 2008-11-25T19:24:37.190 回答
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 中的“struct {}”行告诉编译器 struct foo 的样子。“extern struct”行声明了一个名为“globalFoo”的特定struct foo,带有外部链接。(可以将这两个声明结合起来,请参阅@litb 的回答。)这意味着 globalFoo(bar1/test1 和 bar2/test2)的用户将在其他地方寻找结构,他们不会有自己的单独副本。

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

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

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

于 2008-11-25T23:35:29.977 回答
0

这是一个小例子:

#ifndef __my_header__
#define __my_header__

class my_class
{

};

#endif

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

于 2008-11-25T19:22:51.500 回答