可能是因为我是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没有导入某些库或其他东西导致的问题?我该如何解决?
答案 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描述的传统包含警卫。