3

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

模块信号.h:

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

模块信号.h:

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

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

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

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

4

2 回答 2

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
于 2012-04-11T18:28:22.197 回答
2

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

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

这主要等同于您通过代码片段的解决方案,但可能对 IDE 更友好......

于 2012-04-11T18:40:14.213 回答