我有一个标题,其中包含用户必须遵循的一组特定规则。如果用户不想遵守规则,则必须定义一个禁用检查的预处理器宏。如果用户正在使用库,则用户必须在其使用库中的任何代码的每个类中包含标头,或者由上述预处理器显式地声明(在这种情况下,标头可以隐含地包含在内[使用一个图书馆的课程]很好):
// User using my library, they must include the BaseHeader.h or otherwise use the following define
// #define NOT_USING_BASE_HEADER //(can of course be defined project wide)
#include <BaseHeader.h>
// ... other includes (not necessarily from my library)
class Foo
{
//...
};
有没有办法实现这个目标?请记住,基本标题也包括在内
答案 0 :(得分:1)
我不确定我是否完全理解你的问题,但你认为这会有所帮助吗?
BaseHeader.h:
#pragma once
#define BASE_HEADER_INCLUDED
...
internal_header.h:
#pragma once
#ifdef NOT_USING_BASE_HEADER
#ifdef BASE_HEADER_INCLUDED
#error You can't both define NOT_USING_BASE_HEADER and include the base-header-file.
#endif
...
#elseif defined BASE_HEADER_INCLUDED
...
#else
#error You have to either define NOT_USING_BASE_HEADER or include the base header file!
#endif
如果你想使它不包含baseheader.h的“内部”包含,那么你必须添加/删除一个定义以确保它没有定义它:
internal_header.h:
#pragma once
#define SKIP_HEADER_DEFINE
#include
#undef SKIP_HEADER_DEFINE
在BaseHeader.h中:
#pragma once
#ifndef SKIP_HEADER_DEFINE
#define BASE_HEADER_INCLUDED
#endif
干杯, 西蒙
答案 1 :(得分:1)
我至少看到两个选择:
用户必须执行此操作的文档。这需要在前面,而不是埋在十英里深。您正在使用不遵循规则未定义行为的库(显然不是UB,就语言而言,但就您的库而言,它是UB因为您这么说)。
为他们做。使所有标题#include BaseHeader.h。不要让用户选择调用UB或以其他方式搞砸。
BTW,BaseHeader.h不是库头的最佳名称。您要求进行名称冲突,这就是C ++未定义的行为,而UB是您的错。