-1
votes

Utilisation du commutateur avec des macros

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;
}


9 commentaires

Comment envisagez-vous de utiliser la valeur choisie? S'il vous plaît, montrez-nous un exemple.


Vous connaissez dans C99 OFFER, Const Résultat = 5; n'est pas valide, non? Vous devez être explicite const int sans résultat = 5; , comme la règle Int implicite est obsolète.


@ user694733 édité


Vous ne pouvez pas simplement définir multiplier_by_10 10 et ainsi de suite? Ensuite, il réduit à 5 * chrosen_factor .


@Souravghosh édité. J'ai oublié le type.


En outre, pourquoi ne pas simplement définir simplement #define multiply_by_1000 50000 directement? Quelle avantage la valeur temporaire 4 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 possible dans le préprocesseur. Vous aurez besoin d'une chaîne de #if // #elif // #else


Je ne suis pas sûr de comprendre ce que vous entendez en fixant? Je suppose que vous changeriez Résultat de retour * myfoo; à retour chosen_factor * myfoo;


4 Réponses :


1
votes

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
}


0 commentaires

1
votes

En supposant que je comprends ce que vous demandez, je pense que vous recherchez quelque chose comme ceci: xxx

Ceci définira une macro nommée init_factor 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 xxx

puis, si chrosen_factor est multiplement_by_100 , que La ligne étendrait à xxx

si chrosen_factor n'est pas défini, cette ligne s'étend sur xxx

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.


0 commentaires

1
votes

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));
}


0 commentaires

0
votes

Merci à tous pour vos réponses. Je cherchais une solution spécifique et je suppose que je l'ai trouvé. XXX


0 commentaires