强制在项目中包含标题

时间:2011-06-19 16:00:49

标签: c++

我有一个标题,其中包含用户必须遵循的一组特定规则。如果用户不想遵守规则,则必须定义一个禁用检查的预处理器宏。如果用户正在使用库,则用户必须在其使用库中的任何代码的每个类中包含标头,或者由上述预处理器显式地声明(在这种情况下,标头可以隐含地包含在内[使用一个图书馆的课程]很好):

// 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
{
  //...
};

有没有办法实现这个目标?请记住,基本标题也包括在内

2 个答案:

答案 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)

我至少看到两个选择:

  1. 用户必须执行此操作的文档。这需要在前面,而不是埋在十英里深。您正在使用不遵循规则未定义行为的库(显然不是UB,就语言而言,但就您的库而言,它是UB因为您这么说)。

  2. 为他们做。使所有标题#include BaseHeader.h。不要让用户选择调用UB或以其他方式搞砸。

  3. BTW,BaseHeader.h不是库头的最佳名称。您要求进行名称冲突,这就是C ++未定义的行为,而UB是您的错。