将枚举组合在不同的模块中

时间:2012-04-11 18:22:30

标签: c enums

我有很多包含枚举的模块。 (它们保存在状态机中使用的信号)。

moduleAsignals.h:

enum ModuleASignals {
  modASig1,   
  modASig2,   
  ...
  modASigN,   
};

moduleBsignals.h:

enum ModuleBSignals {
  modBSig1,   
  modBSig2,   
  ...
  modBSigM,   
};

每个模块都有任意数量的信号。

现在我想在一个应用程序中组合随机选择模块。问题是,所有信号必须全局可见,并且信号必须保持唯一。此外,一个信号(8位)的大小也有限制,因此我不能仅为单个模块的枚举提供唯一的偏移量。

如何将单个枚举合并为一个,而无需为每个应用程序调整信号头文件?一种方法是将元素(没有“enum ... {”)放入文件中并包含这些片段,但这会导致IDE无法理解的代码,因此会带来一些不便。

2 个答案:

答案 0 :(得分:4)

如果有一个.h包括另一个可接受,你可以写

enum ModuleBSignals {
  modBSig1 = modASigN+1,   
  modBSig2,   
  ...
  modBSigM,   
};

第二个枚举将在第一个枚举之后开始。

您可以尝试使用虚拟的第一个元素参数化所有模块:

#include "sig_start.h"  // Default one contains #define START 0

enum ModuleBSignals {
  modBSig1 = START,
...

构建过程的责任是为每个模块目录创建一个正确的sig_start.h。第N + 1个sig_start.h将包含

#include module1signals.h
...
#include moduleNsignals.h
#define START modNSigM+1

答案 1 :(得分:2)

您可以使用单个enum并通过预处理器启用特定模块:

enum Signals {
#ifdef USE_MODULE_A
  modASig1,   
  modASig2,   
  ...
  modASigN,   
#endif
#ifdef USE_MODULE_B
  modBSig1,   
  modBSig2,   
  ...
  modBSigM,   
#endif
};

这通过代码片段大致相当于您的解决方案,但可能更适合IDE ...