J'aimerais savoir ce que les inconvénients sont d'utiliser le prétraiteur de telle manière: 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. p> p>
9 Réponses :
Ceci est parfois utile dans un domaine très fermé pour définir des étapes de processus de manière plus lisible: mais il rend généralement le code plus difficile à lire et à comprendre. P> < 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. p> I Utilisez très rarement ce type d'approche. p> p>
Utiliser des macros pour cela n'est plus lisible que d'utiliser des fonctions avec le même nom
Cela dépendra de la langue, du compilateur, etc, etc, etc ... p>
Cependant, il n'y a rien de mal à cela, une fois que le nom implique ces directives se produisent auparavant, le processus de compilation. P>
Le pré-processeur supprime toutes les références constantes de sa valeur réelle, toute la pseudo-fonction avec le code approprié, etc. P>
Tous les problèmes de la science informatique peuvent être résolu par un autre niveau de Indirection p> blockQuote>
C'est l'un de ces niveaux d'indirection supplémentaires: -) p>
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 code> une fois au lieu de changer tous les endroits où la fonction est en cours de appelé. p>
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. P>
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. P>
Le problème est que les arguments sont RE = évalués à chaque fois qu'ils sont utilisés: 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);
Bien que ce soit effectivement un inconvénient des macros, gcc code> fournit extensions spécifiques à compiler i> à la solution de contournement ceci:
#define min (A, B) ({typeof (A) _A = (a); typeof (b) _b = (b); _a <_b? _a: _b;}) code>.
@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 code> a été appelé sur des variables inopportunellement nommées
_a code> et
_b code>.
Il y a plusieurs problèmes à penser: P>
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. P>
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. P>
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 ": 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; p> mais avec une macro "de type de forme", vous seriez obligé d'écrire: p> ce qui mieux Correspond à la syntaxe du pré-processeur avec la syntaxe de langue. p> 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. P> P>
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. P>
généralement cette approche particulière est à peu inutile et à moins que l'appel ne ressemble à p>
SOMEMODULE -> SOMESTORAGE-> STOCKINGLELIST [STOCKAGE.GETFONCTIONNOME] .Pointer-> Quelques fonctionnalités (... argument également obscur ...); P>
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 p> 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. P> 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. p> p>