J'essaie de simuler l'instruction de commutation à l'aide de macros dans mon fichier d'en-tête (.h).
J'ai des macros prédéfinies: P>
uint16_t foo(void)
{
uint16_t myFoo = getMyFooValue();
return result * myFoo;
}
4 Réponses :
comme dans Cette Réponse suggère Je vous suggère d'utiliser Enum pour obtenir la valeur sélectionnée et sur la base de la sélection avec le type ENum, renvoyer la macro que vous avez spécifiée. Pour ce faire, vous pouvez créer une fonction et obtenir la macro correcte comme indiqué ci-dessous.
typedef enum {
MULTIPLY_BY_1
MULTIPLY_BY_10
MULTIPLY_BY_100
MULTIPLY_BY_1000
}multiplier_t;
uint16_t foo(multiplier_t multiplier)
{
switch (multiplier) {
case MULTIPLY_BY_1:
return 1;
case MULTIPLY_BY_10:
return 2;
case MULTIPLY_BY_100:
return 3;
case MULTIPLY_BY_1000:
return 4;
}
return 0; // just in case no code matches
}
En supposant que je comprends ce que vous demandez, je pense que vous recherchez quelque chose comme ceci: Ceci définira une macro nommée puis, si si N'oubliez pas que la substitution macro se produit au moment de la compilation, pas de temps d'exécution. Si vous voulez une solution de temps d'exécution, ce n'est pas ça. p> p> init_factor code> que Prend deux arguments, le nom de la variable pour définir et la valeur de départ. Vous l'ajouteriez dans le corps de votre code comme p> chrosen_factor code> est multiplement_by_100 code>, que La ligne étendrait à p> chrosen_factor code> n'est pas défini, cette ligne s'étend sur p>
Sélection dans le préprocesseur peut être effectué à l'aide d'une macro assistant pour développer un paramètre, puis la collant avec un jeton à KLUDGE une table de recherche:
#include <stdio.h>
int main(void)
{
#define MULTIPLY_BY_1 1
#define MULTIPLY_BY_10 2
#define MULTIPLY_BY_100 3
#define MULTIPLY_BY_1000 4
#define CHOSEN_FACTOR MULTIPLY_BY_100
#define Foo1 1
#define Foo2 10
#define Foo3 100
#define Foo4 1000
#define FooHelper(x) Foo##x
#define Foo(x) FooHelper(x)
printf("%d\n", Foo(CHOSEN_FACTOR));
}
Merci à tous pour vos réponses. Je cherchais une solution spécifique et je suppose que je l'ai trouvé.
Comment envisagez-vous de utiliser i> la valeur choisie? S'il vous plaît, montrez-nous un exemple.
Vous connaissez dans
C99 CODE> OFFER,Const Résultat = 5; code> n'est pas valide, non? Vous devez être expliciteconst int sans résultat = 5; code>, comme la règle Int implicite est obsolète.@ user694733 édité
Vous ne pouvez pas simplement définir
multiplier_by_10 10 code> et ainsi de suite? Ensuite, il réduit à5 * chrosen_factor code>.@Souravghosh édité. J'ai oublié le type.
En outre, pourquoi ne pas simplement définir simplement
#define multiply_by_1000 50000 code> directement? Quelle avantage la valeur temporaire4 code> donne-t-elle?@ user694733 Même si je le fais, comment résoudre la valeur de résultat avec une macro dans le fichier d'en-tête?
Il n'y a pas de Switch It> possible dans le préprocesseur. Vous aurez besoin d'une chaîne de
#if code> //#elif code> //#else code>Je ne suis pas sûr de comprendre ce que vous entendez en fixant? Je suppose que vous changeriez
Résultat de retour * myfoo; code> àretour chosen_factor * myfoo; code>