0

我试图通过使用不透明的结构和前向声明从我的项目中安全地删除依赖项,但像大多数人一样,我仍然停留在我的枚举上。

我试图从头文件中删除的头文件依赖项定义了我想将枚举值设置为的常量。像这样的东西

// depends header
#define DEP_TYPE_ONE   1
#define DEP_TYPE_TWO   2
#define DEP_TYPE_THREE 3

// My header
enum TYPES
{
    T_ONE     = DEP_TYPE_ONE,
    T_TWO     = DEP_TYPE_TWO,
    T_THREE   = DEP_TYPE_THREE
}

我试图找出一种不必在我的标题中包含依赖标题的方法。

答案很可能只是“你不能那样做”,但我只是想问一下,因为一个解决方案会让我的生活无限轻松。

4

4 回答 4

1

如何删除依赖标头的包含,对值进行硬编码并注释依赖项:

// my_header.h

// NOTE: Enumerands must be in sync with symbols defined in depends.h
enum TYPES
{
    T_ONE     = 1, // DEP_TYPE_ONE
    T_TWO     = 2, // DEP_TYPE_TWO
    T_THREE   = 3  // DEP_TYPE_THREE
};

为了减轻对值不同步的担忧,您可以拥有另一个包含一个或多个编译时断言的头文件或源文件(您的类或 API 的用户无法获得的文件):

// Some non-distributed file

#include <depends.h>
#include "my_header.h"

// Compile-time assertion macro
#define compile_time_assert(cond, msg) \
    typedef char msg[(cond) ? 1 : -1]

// Check assumptions at compile time...
compile_time_assert(T_ONE==DEP_TYPE_ONE, ValueOutOfSync1);
compile_time_assert(T_TWO==DEP_TYPE_TWO, ValueOutOfSync2);
    .
    .
    .

如果值不同步,这会给你一个编译时错误。

有关 compile_time_assert 宏的更多信息,请参阅:http ://www.embedded.com/columns/programmingpointers/164900888?_requestid=379501

于 2010-02-24T06:33:21.167 回答
0

这不是您想要的,但它是不在您的标头中包含依赖标头的唯一方法:

enum TYPES 
{ 
    T_ONE     = 1, 
    T_TWO     = 2, 
    T_THREE   = 3 
} 
于 2010-02-24T05:21:39.090 回答
0

不是一个完美的答案,但是您是否考虑过匿名枚举?我曾经在使用一个图表库时遇到过类似的问题,该库在具有很多内部依赖性的标头中定义了很多常量。这影响了我们的编译时间。所以,我只是将整个 MOCked#define's到标题中匿名命名空间中的匿名枚举中!就像是 :-

namespace {
  enum {
    DEP_TYPE_ONE = 1,
    DEP_TYPE_TWO,
    // ....
    DEP_TYPE_LAST
  };
}

使用这种方法,您不必重构大量直接使用这些命名常量的代码。但是,一旦标头定义了新常量,就更新枚举是一场维护噩梦。

我猜你的情况值得一试。

高温下,

于 2010-02-24T05:23:20.807 回答
0

你是对的,你不能。您在这里处理的是预处理器而不是编译器(与前向声明一样)。

如果您的编译器支持“强制包含”选项,则可能会“伪造它” ,但依赖关系仍然存在,并且您仍然需要构建文件。

于 2010-02-24T05:40:00.620 回答