2010-11-01 8 views
1

J'ai un code existant qui utilise un enum au lieu d'un pointeur de fonction pour les rappels. Le rappel est appelé à l'aide d'une table: callback_table[enum].Renommer la variable dans le préprocesseur C

Les énumérations sont nommées avec un enum_ prefix et la fonction correspondante est nommée avec un func_ prefix.

Ainsi, les appels de fonction impliquant callbacks ressembler à ceci:

foo (param, enum_name); 

Alors que le code de navigation, je dois prendre la partie du nom et le préfixe func_ au lieu de faire juste un « saut à la définition ».

Je voudrais avoir une macro de sorte que mon code ressemble à ceci:

foo (param, f2e(func_name)); 

pour que je puisse garder le code existant inchangé et toujours en mesure de faire un « Aller à la définition ».

Est-il possible d'avoir une telle macro? La solution la plus simple serait d'omettre func_ ce qui signifie que f2e simple attache le enum_ prefix, mais je préférerais une solution où je peux encore avoir func_. Est-ce possible?

Répondre

1

Il est un peu rond-point, mais vous pouvez faire quelque chose comme ceci:

(supposons, pour les besoins de cet exemple, que vous avez trois valeurs enum possibles enum_one, enum_two et enum_three).

#define enum_func_one enum_one 
#define enum_func_two enum_two 
#define enum_func_three enum_three 

#define f2e(func_name) enum_ ## func_name 

l'inconvénient (bien sûr) est que vous aurez besoin d'un #define spécial pour chaque valeur possible de votre ENUM.


Alternative

Comme alternative, si votre seul besoin est d'avoir le nom de la fonction à portée de main, vous pouvez utiliser la fonction « saut à la définition » de votre IDE ... vous pourriez faire quelque chose comme ceci:

#define f2e(name, func_name) enum_ ## name 

alors votre appel ressemblera à ceci:

foo (param, f2e(one, func_one)); 

un peu redondant peut-être, mais il permettrait d'atteindre votre objectif avec une intrusion minimale dans le reste de votre code.

Questions connexes