Question

Certains sont coûteux affirme, certains sont mieux ÉTEINT en code de production. Au moins il est clair que les affirmations doivent être activées.

Dans ma demande, je voudrais pouvoir activer / désactiver une partie des assertions sur fichier par fichier ou par classe.

Comment le faire en C ++?

Était-ce utile?

La solution

Pour désactiver le module à l'échelle affirme j'utiliser:

#if defined(assert)
#  undef assert
#  define assert(x) ((void)0)
#endif

... Bien sûr, cela peut être simplifiée si vous êtes d'accord avec l'aide d'une macro personnalisée.

#if defined(_NO_ASSERTS)
#  define myAssert(x) ((void)0)
#else
#  define myAssert(x) assert(x)
#endif

Pour la classe à l'échelle désactivation j'utiliser un membre statique de classe const ou un ENUM de classe à l'échelle en combinaison avec une macro personnalisée:

#define myAssert(x) do { if(_CLASS_ASSERT) { assert(x); } } while(0)

class AssertOff
{
  enum { _CLASS_ASSERT = 0 }
}

Avec les énumérations et const statiques bools tous les compilateurs modernes devraient optimiser loin le if(_CLASS_ASSERT) {}.

Autres conseils

Pour coder avec des assertions considère un bon style de codage.

En ce qui concerne l'exécution activer / désactiver Vous pouvez le faire qu'avec variable booléenne. Par exemple, dans votre code, vous pouvez effectuer les opérations suivantes:

Définir une variable qui sera utilisée pour indiquer si les assertions sont activées ou désactivées dans un espace de noms global (par exemple de votre fonction main () dans le même fichier).

bool  turnOnAssertions;

Définir une variable comme écrit ci-dessous dans d'autres fichiers sur lesquels vous souhaitez activer / désactiver vos affirmations:

extern bool turnOnAssertions; 

en manipulant la variable turnOnAssertions avec l'interface utilisateur et de l'écriture

if(turnOnAssertions)
assert(…);

vous pouvez activer / désactiver certains d'entre vous affirmations!

En ce qui concerne la compilation vous devez faire ce qui suit:

Pour vous compilateur vous devez donner un drapeau comme -DASSERTIONSON (-Dflag_name [nom du drapeau que vous pouvez définir tout ce que vous voulez])

#ifdef ASSERTIONSON 
bool turnOnAssertions = true;
#else
bool turnOnAssertions = false;
#endif

Et il suffit d'utiliser la variable.

Bonne chance!

Pour désactiver les assertions d'un fichier C ++, vous pouvez faire une des opérations suivantes:

  • Définir la constante de NDEBUG près du haut du fichier source.
  • Ajoutez le -DNDEBUG aux options de compilation du fichier source.

La plupart des environnements de développement et / ou la construction d'infrastructures vous permettent de spécifier des options de construction par fichier, c'est donc une solution facile.

Mise hors affirmations sur une base par classe est plus difficile lorsque plusieurs classes sont mélangés dans le même fichier source, ou si vous avez beaucoup de fonctions en ligne dans vos fichiers d'en-tête. Vous pouvez bien sûr #define NDEBUG et #undef NDEBUG dans les endroits appropriés.

Étant donné que certains IDEs attendent de pouvoir mettre NDEBUG pour les non-debug, vous pouvez le rendre plus extensible, en choisissant votre propre nom de macro, comme DISABLE_ASSERT. Ensuite, inclure le code comme comme le suivant dans un fichier d'en-tête commune (qui n'est pas précompilées):

 #ifdef DISABLE_ASSERT
 #define NDEBUG
 #endif
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top