6
votes

Quel est l'inconvénient d'utiliser le préprocesseur pour définir un appel de la fonction?

J'aimerais savoir ce que les inconvénients sont d'utiliser le prétraiteur de telle manière: xxx

essentiellement, je me sens comme ça est faux (ou certainement pas une meilleure pratique) - mais je Je ne sais pas pourquoi ... mes compétences de préprocesseur sont au mieux rouillées.


0 commentaires

9 Réponses :


0
votes

Ceci est parfois utile dans un domaine très fermé pour définir des étapes de processus de manière plus lisible: xxx

mais il rend généralement le code plus difficile à lire et à comprendre. < P> Sauf si la valeur de votre code ne vaut pas la peine de faire savoir ce que ces # définissent la signification en détail, et c'est une sorte de coupe courte, vous obtenez simplement des gens à regarder dans deux endroits pour comprendre une ligne de code (haut du dossier et en fonction) plutôt qu'un.

I Utilisez très rarement ce type d'approche.


1 commentaires

Utiliser des macros pour cela n'est plus lisible que d'utiliser des fonctions avec le même nom



0
votes

Cela dépendra de la langue, du compilateur, etc, etc, etc ...

Cependant, il n'y a rien de mal à cela, une fois que le nom implique ces directives se produisent auparavant, le processus de compilation.

Le pré-processeur supprime toutes les références constantes de sa valeur réelle, toute la pseudo-fonction avec le code approprié, etc.


0 commentaires

0
votes

Tous les problèmes de la science informatique peuvent être résolu par un autre niveau de Indirection

C'est l'un de ces niveaux d'indirection supplémentaires: -)

dire qu'à un moment donné que la fonction a besoin d'un autre argument ou que vous n'avez pas besoin de l'appeler du tout, vous pouvez modifier le #define une fois au lieu de changer tous les endroits où la fonction est en cours de appelé.

utile pour le développement, mais dangereux de rester dans le code de production ... J'exécuterais le préprocesseur pour remplacer cette règle une fois que j'ai un code mature et savoir que je n'ai pas besoin de le changer.


0 commentaires

5
votes

Un inconvénient? Habituellement, une définition macro ne se retrouve pas dans la table des symboles de l'exécutable. Légèrement plus difficile à déboguer.


0 commentaires

5
votes

Le problème est que les arguments sont RE = évalués à chaque fois qu'ils sont utilisés: xxx pré>

avis que je dois emballer tous les arguments de '(' ') "pour que le L'expression évalue coricellement. Mais que se passe-t-il si nous faisons cela? P>

int  s = MIN(++current,Max);


3 commentaires

Bien que ce soit effectivement un inconvénient des macros, gcc fournit extensions spécifiques à compiler à la solution de contournement ceci: #define min (A, B) ({typeof (A) _A = (a); typeof (b) _b = (b); _a <_b? _a: _b;}) .


@Kenny: Votre macro foo est meilleure que la mienne. Je l'ai essayé et il fonctionne. Bien que cela ne ressemblait pas à ce serait, je ne pensais pas qu'une déclaration (bloc) pourrait agir comme une remparité.


@Kenny: Malheureusement, pas l'extension de GCC ne fonctionnerait si min a été appelé sur des variables inopportunellement nommées _a et _b .



2
votes

Il y a plusieurs problèmes à penser:

  • en C ++, la macro n'a pas d'espace de noms et de classe de classe, donc c'est la même chose partout. Un exemple pour cela est le malheureux min et max définit quelque part dans Windows.h. Si vous programmez pour Windows et incluez Windows.h et souhaitez écrire STD :: numeric_limits :: max () puis max sera remplacé par un code ... Ceci laisse un code inaboutable après le déroulement du préprocesseur. (Ok, il y a des moyens de désactiver les macros min / max dans Windows.h, mais c'est encore une mauvaise conception!)
  • La macro ne peut pas être débogué bien. Le débogueur s'arrêtera sur la ligne La macro est utilisée non sur le code à l'intérieur de la macro ...
  • Réévaluation possible des paramètres de macro (vous pouvez l'empêcher d'empêcher un bloc avec des variables locales à l'intérieur de la macro, mais cela ferait de débuger encore pire!)

0 commentaires

0
votes

Pourquoi rechercheriez-vous des inconvénients dans l'utilisation d'un code de préprocesseur spécifique? L'utilisation de macros de préprocesseur pour autre chose que la compilation conditionnelle (y compris les gardes) doit être automatiquement considérée comme mauvaise. La bonne question à demander est de savoir s'il y a des avantages à une utilisation particulière.

Les macros de préprocesseur ne respectent aucune portée ou utilisation de quelque manière que ce soit. Ils peuvent bousiller parfaitement bon code de manière inattendue et difficile à trouver. Toujours les éviter sauf si vous avez une bonne raison d'utiliser un.


0 commentaires

1
votes

Eh bien, si vous devez le faire (et il y a des occasions lorsque vous pourriez que vous puissiez), vous devez au moins définir la macro comme "la fonction ressemblant à" de la fonction ": xxx

sinon vous le feriez écrire un code qui ressemblait à une mission par une constante quand il s'agissait d'un appel de fonction; c.-à-don; xxx

mais avec une macro "de type de forme", vous seriez obligé d'écrire: xxx

ce qui mieux Correspond à la syntaxe du pré-processeur avec la syntaxe de langue.

Les macros généralement semblables à la fonction sont mieux évitées, mais certaines sont plus insidieuses que d'autres, ce n'est en aucun cas le pire des cas. Cependant, vous pouvez simplement écrire facilement une emballage de fonction en C, ou en C ++, utilisez un argument par défaut, ce qui serait préférable dans la plupart des cas.


0 commentaires

0
votes

L'inconvénient est que vous cachez le code. L'avantage est que vous cachez le code.

L'inconvénient est généralement extérieure à l'envers.

généralement cette approche particulière est à peu inutile et à moins que l'appel ne ressemble à

SOMEMODULE -> SOMESTORAGE-> STOCKINGLELIST [STOCKAGE.GETFONCTIONNOME] .Pointer-> Quelques fonctionnalités (... argument également obscur ...);

il n'y a aucun point. Si seulement l'argument est un appel obscur, sténographique uniquement l'argument. Si ce n'est que la fonction, sténographique seulement la fonction. Si les deux, vous serez peut-être mieux avec xxx

si la fonction n'est jamais appelée avec quoi que ce soit d'autre, vous pourriez envisager de le supprimer de la liste des arguments et d'obtenir à l'intérieur du corps de la fonction. Et si la paire se répète très souvent, dans de petites variations, vous pouvez envisager des fonctions d'emballage.

Après avoir effectué plusieurs bugs dans le code d'une macro, vous apprendrez que c'est la douleur pour les déboguer et vous ne le ferez pas utilisez-les frivoleusement.


0 commentaires