0
votes

Créer une instance dans une macro #define

Je ne voudrais pas quelque chose comme: #define quelque_func (a) quelque_func (a, create_foo ())

et ensuite lorsque vous utilisez: xxx

le FOO < / Code> L'instance ne doit être créée qu'une seule fois pour chaque ligne. Donc, dans le cas ci-dessus, 2 fois. Et quand la boucle fonctionne à nouveau, il ne faut pas créer à nouveau aux instances foo .

est une chose tellement possible?

Voici le programme complet non fonctionnel : La sortie doit être 3, 40, 6, 80, 9, 120, 12, 160, ... xxx

éditer.

J'ai essayé d'isoler l'exemple à un minimum nu, mais je tire moi-même au pied maintenant. Dans la chose réelle, je n'ai pas de void comme type de retour mais un booléen .

Alors j'essaye quelque chose comme ça maintenant:

#define DEBONCE (VAL) pour (Static Auto D = Create_Debounce (); Déboquez (D, VAL), FAUX; )

mais celui-ci échoue lorsqu'il est utilisé avec: int état = DEBONCE (digitalRead (Button_fire));

Cause La macro ne donne pas de valeur de retour, donc aucune mission ne peut se produire.

J'ai donc besoin quelque chose comme: #define DEBONCE (VAL) true; pour (statique auto d = create_debounce (); débond (d, val), false;)

true est le résultat du create_debounce < / Code> Fonction.

Pour que cela puisse empoisonner encore plus pour la rendre possible? Voici le code complet: xxx


7 commentaires

Pourquoi utiliseriez-vous une macro pour cela? Pourquoi ne pas simplement déclarer et définir un autre certains_func (int a) fonction pour appeler plus spécifique one_func (int, foo &) ?


@uv_ Parce que OP pense que le Createefoo est ensuite appelé une seule fois.


"Mais je tire moi-même au pied maintenant" correct. Enlevez les macros, ils ne font pas ce que vous pensez qu'ils font.


@Storyteller au moins il n'y a pas une paillette les tenant ... ou une suppression ^ _ ^


@Storyteller Désolé, ce n'était pas exprès, je pensais abstraiter le problème aidé. Votre réponse était toujours très utile.


@Storyteller Je l'ai maintenant et je n'aurais jamais pu le faire sans toi. Si vous fournissez #define DEBONCE (VAL) ({INT R; POUR (STATIQUE AUTO D = CREATE_DEBONCE (); R = DEBONCE (D, VAL), FAUX;); R;}) Réponse Je vais vous donner la marque.


@ Clankill3R - D'accord. J'ai l'autre approche éditée. C'est standard C ++, bien que je mentionne des expressions de déclaration.


4 Réponses :


1
votes

Lorsque la boucle est à nouveau exécutée, les instances FOO sont à nouveau créées, elles ne sont pas restaurées à partir de l'exécution précédente.

Je soupçonne ce que vous voulez faire consiste à utiliser un ensemble de variables statiques. Ou refacteur votre code pour plus de clarté.

Cette macro ne vous aide pas dans cette affaire, ne l'utilisez pas, utilisez des variables explicites, puis vous verrez la durée de vie des objets. Une macro ne fait pas partie du compilateur, mais du préprocesseur.


0 commentaires

0
votes

En plus d'être mal formé, votre macro n'est pas utile pour ce que vous voulez car vous appelez create_foo sur chaque invocation.

Vous pouvez utiliser des variables statiques: < Pré> xxx


0 commentaires

3
votes

Si vous êtes prêt à obtenir vraiment moche, vous pouvez accomplir pratiquement n'importe quoi. Je ne réponds que parce que ceci est un teaser cérébral.

Vous pouvez définir la macro comme ceci: xxx

Oui, cela fonctionnera. Dans Standard C ++, la clause d'AI de A pour boucle peut contenir une déclaration de variable statique. La variable sera donc initialisée qu'une seule fois. Ensuite, la "condition" est l'appel actuel à one_func suivi de l'opérateur de la virgule avec false , la fonction est donc uniquement exécutée une fois que la bouclette est entrée à chaque fois que la bouclette est entrée.

adapter votre code d'Arduino à Standard C ++ et simulant les quatre cycles, généré la même sortie que vous vouliez. Voir Live .


Alternativement, si vous Voulez-vous apparaître légèrement moins cryptique (mais pourquoi voulez-vous?), vous pouvez opter pour cela: xxx

même chose vraiment.


D'accord , en l'appliquant à vos appels de problèmes réels pour quelque chose de différent: xxx

Ceci définit et invoque immédiatement une Lambda. Étant donné qu'un lambda crée un type de fermeture unique partout où il apparaît dans un programme, cela créera un objet statique unique pour chaque expression que vous écrivez de débattre (...) in. Une alternative est l'expression de relevé spécifique de la GCC . Mais contrairement à une Lambda, c'est une extension. Que vous pouvez ou non vouloir utiliser, ymmv.


2 commentaires

Aïe qui fait mal: p


Je comprends bien. Je suis triste cependant, j'ai vraiment cru un instant que pour (auto-auto statique ...); pour (statique auto n = ...); créerait un seul n .



0
votes

La première chose à noter, c'est que votre état est un booléen. Cela vous sauvera quelques octets de RAM.

La prochaine chose à souligner est que vous souhaitez ignorer les modifications apportées à l'entrée pendant une période de temps; Cela signifie que vous n'avez pas besoin de stocker l'état "actuel"; Juste le dernier état ... qui finira par être la même chose. Cela pourrait ne rien vous sauver quoi que ce soit, car les 2 booléens et 1 booléen vont probablement juste prendre un octet; Mais cela donne au compilateur une chance, et surtout, rend les choses plus simples.

avec ces 2 améliorations assez mineures faites, nous arrivons aux plus grands. N'utilisez pas de macros à moins que vous sachiez vraiment ce que vous faites; Et même ensuite reconsidérer.

L'exemple de code Arduino a tendance à leur offrir parce que quelqu'un a pensé que cela faciliterait l'apprentissage; Mais honnêtement, ils ne le font pas. Ils ne sont pas une fonction et votre utilisation ne fait pas vraiment ce que vous pensez que cela fait. Arduino offre des moyens limités de le déboguer. Vous ne pouvez donc pas dire que votre état sera toujours élevé, car la macro expansion est la suivante: xxx

déplacez-le à une fonction ; Laissez le compilateur optimiser le code car il sera toujours faire un meilleur travail que vous aussi longtemps que vous écrivez le code d'une manière qui le laisse.


0 commentaires