1

我之前问过这个问题,但我使用了我被告知的内容来尝试让我的程序正常工作:

可能是因为我是 C++ 的菜鸟,但#ifndef由于我的类包含相同的 .h 文件的问题,我无法使用。sh 和 th 和 main.cpp 都需要 rh 中定义的结构

我有

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

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

在我的主 cpp 文件中

在我的每个 sh 和 th 文件中,都有一个

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

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

#include <iostream>

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

主要cpp没有导入某些库或其他东西引起的问题吗?我如何解决它?

4

3 回答 3

4

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

#ifndef S_H
#define S_H

// All of your s.h declarations go here

#endif

rh 看起来像这样:

#ifndef R_H
#define R_H

// All of your r.h declarations go here

#endif

等等。

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

于 2010-11-10T02:58:37.727 回答
0

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

您是否可能认为带有“struct r”的语句为您的程序定义了 r?

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

#ifndef R_H
#define R_H
#include <iostream>

using namespace std;

struct r{
//code
};

#endif

(正如并且已经指出的那样)

注意:我使用定义 R_H 而不是 r 以避免混淆。您想将 r 用于您的结构,将 R_H 用于您的标头中的定义(嗯,实际上是模块的名称+“_H”)。

于 2010-11-10T03:10:47.127 回答
0

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

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

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

于 2010-11-10T03:12:09.017 回答