3 votes

combiner des enums dans différents modules

J'ai un certain nombre de modules qui contiennent des enums. (ils contiennent des signaux qui sont utilisés dans une machine d'état).

moduleAsignals.h :

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

moduleBsignals.h :

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

Chaque module possède un nombre arbitraire de signaux.

Je voudrais maintenant combiner un choix aléatoire de modules dans une seule application. Le problème est que tous les signaux doivent être visibles globalement et que les signaux doivent rester uniques. Il y a aussi une limite à la taille d'un signal (8bit), donc je ne peux pas simplement donner des offsets uniques aux enums des modules individuels.

Comment puis-je combiner les différents enums en un seul sans avoir à adapter les fichiers d'en-tête de signal pour chaque application ? Une solution serait de mettre les éléments (sans "enum ... {") dans un fichier et d'inclure ces fragments, mais cela donnera un code que l'IDE ne pourra pas comprendre et qui entraînera donc quelques inconvénients.

4voto

byako Points 2653

S'il est acceptable qu'un .h inclue l'autre, vous pouvez écrire

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

La deuxième énumération commencera donc juste après la première.

Ajouté :

Vous pouvez essayer de paramétrer tous vos modules avec un premier élément fictif :

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

enum ModuleBSignals {
  modBSig1 = START,
...

Il incombe alors à votre processus de construction de créer un sig_start.h correct pour chacun de vos répertoires de modules. Le N+1ème sig_start.h contiendra

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

2voto

Christoph Points 64389

Vous pouvez utiliser un seul enum et activer des modules spécifiques via le préprocesseur :

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

C'est en grande partie équivalent à votre solution via les fragments de code, mais pourrait être plus favorable aux IDE...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X