#ifdef DEBUG versus #if DEBUG
Il est clair pour moi lors de l'utilisation des directives de compilation qui de ci-dessous deux extraits de code est correct/préféré et pourquoi. Il semble que la plupart des développeurs et les projets Open Source que j'ai vu utiliser le premier, mais j'ai vu le deuxième fréquemment utilisé en tant que bien.
#ifdef DEBUG
[self doSomethingOnlyWhenDebugging];
#endif
CONTRE
#if DEBUG
[self doSomethingOnlyWhenDebugging];
#endif
Dont le code ci-dessus des extraits est préférable pour l'exécution de code seulement pendant le débogage et pourquoi? Ma conjecture est que le premier d'exécution si le DÉBOGAGE est définie comme TRUE ou FALSE si la seconde ne fonctionnera que si le DÉBOGAGE est défini et mis à TRUE. Est-ce exact?
#ifdef
simplement des tests, si le symbole est pas définie.#if
teste la VALEUR du symbole. donc#define FOO 0
fera#ifdef FOO
être vrai, mais#if FOO
être faux, parce que c'est de faire des#if 0
.- Vous devez tenter de trouver la "racine" de la définition et de déterminer si la valeur est destiné à être un 1/0 valeur ou un présent/absent. Se tromper peut avoir "inattendue" des conséquences.
Vous devez vous connecter pour publier un commentaire.
Vous sont corrects.
#if DEBUG
ne vais pas évaluer siDEBUG
est défini comme0
.Comme pour l'utilisation de chaque, vous pouvez coller à l'aide de
#ifdef
pour quoi que ce soit où vous avez seulement besoin de ajouter code si la définition de préprocesseur est présent, comme l'ajout de la journalisation du débogage. Si vous avez besoin d'inspecter la valeur et de descendre les différents compilation des chemins, alors je voudrais utiliser un0
ou1
. Un bon exemple de cela estTARGET_IPHONE_SIMULATOR
, qui est toujours définie pour un projet iOS, mais seulement1
si vous êtes à la compilation pour le simulateur.#if
parce queTARGET_IPHONE_SIMULATOR
est défini indépendamment du fait que je suis en cours d'exécution sur Simulateur ou pas. - Il Correct?Que je sais, le meilleur choix est:
ensuite, vous savez
#ifndef DEBUG
est préféré au-dessus de tous les autres.Il est plus simple choix:
Toutefois, si -Wundef compilateur drapeau est sur, il y a peut être un avertissement avec
#if DEBUG == 0
.Vous avez besoin de regarder le code de DÉBOGAGE est défini ou non défini, et d'écrire votre code en conséquence. Avec la fonction de DÉBOGAGE, vous trouverez qu'il n'est pas défini ou est définie avec une valeur de 1. Donc, soit
#if
DEBUG ou#ifdef
DEBUG fonctionne.Pour
#define
's qui sont sous votre contrôle, je vous recommande de toujours définir eux, soit avec une valeur de 0 ou 1. Vous pouvez ensuite utiliser#if
pour le contrôle de la valeur, mais vous pouvez également les utiliser directement dans une instruction if ou dans une expression, ce qui peut rendre votre code plus lisible. Et depuis il est toujours défini, vous pouvez utiliser le bouton "Saut À la Définition de" dans Xcode pour aller à l'endroit où elle est définie et vérifier comment et pourquoi elle est définie. Si, au contraire, soit#define
ou pas#define
la valeur, et il n'est pas défini, alors Xcode n'ont aucune idée où dans votre code source, il n'est pas défini. Il vous donne également une chance de regarder pour le mal orthographié utilise. Si "Saut à la Définition de" ne fonctionne pas, alors vous savez que vous avez mal écrit.BTW Sein d'une
#if
directive, une macro qui n'est pas défini, est remplacé par 0. Donc#if
de DÉBOGAGE ne fonctionne pas si le DÉBOGAGE est pas définie, ou si le DÉBOGAGE est définie à 0, et il ne compile pas si DEBUG est défini comme rien - qui vous dira ce qui est mauvais, de sorte que vous pouvez le fixer. De ce point de vue, l'utilisation de#if
est mieux, à moins qu'il ne compile pas.