多个类中使用的函数

时间:2010-11-10 02:54:42

标签: c++ header include include-guards

之前我曾经问过这个问题,但是我使用了被告知的方法来尝试让我的程序运行:

可能是因为我是C ++的菜鸟,但由于我的类包含相同的.h文件的问题,我在使用#ifndef时遇到了麻烦。 s.h和t.h以及main.cpp都需要在r.h中定义的结构

我有

#include "s.h"
#include "t.h"

#ifndef r
#include "r.h"
#endlif

在我的主cpp文件中

在我的每个s.h和t.h文件中都有一个

#ifndef r
#include "r.h"
#endlif
// and then its class

同样,但是编译器在r.h文件中给出了关于expected nested-name-specifier before "namespace"unqualified id before using namespace std;expected ';' before "namespace"的错误,即使我在r.h文件中的所有内容都是:

#include <iostream>

using namespace std;
struct r{
// code
};

主cpp没有导入某些库或其他东西导致的问题?我该如何解决?

3 个答案:

答案 0 :(得分:4)

#ifndef需要进入头文件以防止多次包含它。所以,你的s.h看起来像这样:

#ifndef S_H
#define S_H

// All of your s.h declarations go here

#endif

r.h看起来像这样:

#ifndef R_H
#define R_H

// All of your r.h declarations go here

#endif

等等。

这可以防止头文件被多次包含。如果在单个编译单元中多次包含相同的头文件,编译器可能会抱怨多次声明了相同的符号。如果以递归方式包含相同的标题集合,它还可能在编译期间引发无限循环。

答案 1 :(得分:0)

我希望你使用r,s和t来简化你的问题。

您是否有可能认为带有“struct r”DEFINES r的语句适用于您的程序?

这是两种不同的定义。一个是结构定义,但您想使用define:

#ifndef R_H
#define R_H
#include <iostream>

using namespace std;

struct r{
//code
};

#endif

(正如andand已经指出的那样)

注意:我使用的是定义R_H而不是r来避免混淆。您希望将r用作结构,将R_H用于标题中的define(实际上,模块名称为“_H”)。

答案 2 :(得分:0)

编译器指令如#include#ifdef是“C预处理器”的一部分,它实际上是与C不同的编程语言。因此预处理器看不到您的struct r。你在r.h中需要这样的东西:

#include <iostream>
#define r
using namespace std;
struct something_that_isnt_called_just_r{
// code
};

这就是为什么你最好使用@andand描述的传统包含警卫。