9
votes

C Concaténation de jeton macro impliquant une variable - est-ce possible?

J'essaie de définir une macro pour générer un nom de jeton, contenant une variable.

essentiellement, ce que j'essaie, c'est ceci: xxx

i «M Spective à générer le jeton P2Dir dans la déclaration ci-dessus, mais selon la sortie de mon compilateur, il génère le jeton Portdir, ce qui n'est pas ce que je voulais. Toute aide ici? Ou est ce que je tente de faire impossible?


1 commentaires

Avez-vous l'intention de faire #define Port 2 ?


4 Réponses :


9
votes

Je ne pense pas ce que vous essayez de faire est possible. C Macros sont vraiment des macros de préprocesseur qui sont élargis avant la compilation. La variable port n'est pas définie tant que le temps d'exécution.


1 commentaires

Merci, c'est ce que je pensais. Ça avait été un moment depuis que j'ai fait droit C.



6
votes

C'est impossible. C Les préprocesseurs fonctionnent en transformant jetons forts>, et ils ne font aucune résolution ni substitution qui nécessiteraient des connaissances de la mécanique de la langue (à l'exception de l'arithmétique de base impliquant des littéraux entier, du sommet de ma tête). Considérez, par exemple, les docs du préprocesseur de GCC concernant la tokénisation . Seul un compilateur saura que faire avec le "port" variable. "

une solution consiste à faire quelque chose comme: p> xxx pré>

...

int port;
PxDIR(port, 2);


2 commentaires

Merci. Je considérais cela comme un moyen de réduire le code de code dans un projet intégré, mais il semble qu'il est impossible d'utiliser une variable pour résoudre ce problème. Et bien. Merci encore!


@ user438605 En effet, bien que vous souhaitiez voir le X Macro Idiom pour la génération de code répétée.



5
votes

... ou simplement faire un port aussi une macro: xxx


0 commentaires

0
votes

Qu'est-ce que vous essayez de faire n'a pas de sens.

#define GLUER(x,y,z) x##y##z
#define PxDIR(x) GLUER(P,x,DIR)

uint16_t* get_port_pointer(uint8_t port_id) {
  if (port == 0) {
    return &PxDIR(0);
  } else if (port == 1) {
    return &PxDIR(1);
  } else if (port == 2) {
    return &PxDIR(2);
  } else if (port == 3) {
    return &PxDIR(3);
  } else {
    return &0;
  }
}

int main() {
  int port;
  port = 2;

  *(get_port_pointer(port)) |= 0x01;
}


0 commentaires