我试图检查是否#include <file.h>已经使用C++宏声明了.
在file.h我做:
#ifndef FILE.H
#define FILE.H
class A
{
//do routines
};
#endif
Run Code Online (Sandbox Code Playgroud)
在第二个文件中,second.h我想检查是否file.h已经包含.
典型的伪代码:
#ifndef "file.h"
#include "file.h"
#endif
#ifndef SECOND.H
#define SECOND.H
class second
{
//do routine
};
#endif
Run Code Online (Sandbox Code Playgroud)
我尝试了一些#ifndef指令,但没有快乐.有谁知道如何实现这一目标?
Mar*_*ork 10
其他人都已正确包含了包含保护宏.
#ifndef FILE_H
#define FILE_H
// Code here
#endif
Run Code Online (Sandbox Code Playgroud)
但其他人错过了关于正确用法的问题的第二部分:
这是一个不良用法的例子:
#ifndef FILE_H
#include "file.h"
#endif
#ifndef SECOND_H
#define SECOND_H
class second
{
//do routine
};
#endif
Run Code Online (Sandbox Code Playgroud)
这是不正确的(虽然正确可能太强).
每个文件中的包含警戒应包围其整个内容.所以,在第二个文件中,#include "file.h"应该在包含警戒内.
你也不要需要测试包括将文件本身内进行.因此该文件应如下所示:
#ifndef SECOND_H
#define SECOND_H
#include "file.h"
class second
{
//do routine
};
#endif
Run Code Online (Sandbox Code Playgroud)
你的宏观守卫太小了.其他人很可能会使用这些; 这将导致各种奇怪的碰撞.
使警卫独特的一个好方法是使用前缀,您的全名(或昵称),或者如果您拥有自己的注册网站,则使用其域名.然后我还添加了包含该文件的目录层次结构的一部分.
#ifndef WEBSITE1_NAMESPACE1_NAMESPACE2_FILENAME_H
#define WEBSITE1_NAMESPACE1_NAMESPACE2_FILENAME_H
#endif
Run Code Online (Sandbox Code Playgroud)
另一种替代方法(特别是如果您在Windows上工作)是生成GUID.只需为每个文件生成一个新文件.
最后一点:如果内容是绝对必要的,则只包含头文件中的其他文件.如果此文件具有类second定义的类型定义,则只需要包含"file.h".如果您的类仅将该类用作指针或引用,则更喜欢使用前向声明而不是头文件.
您必须的场景#include:
objectsobjects作为参数的方法objects作为结果请注意,我使用术语"对象".如果它们是引用或指针,那么这不算数.在这些情况下,您可以使用前向声明来解决问题.
在file.h中:
#ifndef FILE_H
#define FILE_H
...
...
...
#endif
Run Code Online (Sandbox Code Playgroud)
然后检查file.h是否包含在:
#ifdef FILE_H
Run Code Online (Sandbox Code Playgroud)