2013-01-03 5 views
0

Je voudrais définir les niveaux de journal dans mon code:redéfinition non désirée

#define INFO 1 
#define WARNING 2 
#define ERROR 4 
#define DEBUG 8 

Mais dans une autre libs standard de Microsoft déjà erreur définis et ressemble à d'autres termes sont également réservés. Comment faire face à une telle situation?

+0

Que voulez-vous que le résultat final soit dans de telles situations? Et qu'avez-vous essayé? –

Répondre

0

Malheureusement, Microsoft définit beaucoup de macros qui sont injectées dans votre code que vous les aimiez ou non. Donc, mieux vaut ne pas répéter leur erreur et éviter de définir des macros. Le meilleur que vous pouvez faire est de définir constantes au lieu de macros, et les mettre dans un espace de noms pour éviter les conflits de noms. Par exemple:

namespace Log 
{ 
    const int Info = 1; 
    const int Warning = 2; 
    const int Error = 4; 
    const int Debug = 8; 
} 

Ensuite, vous les utiliser dans votre code comme Log::Info, Log::Error et ainsi de suite.

EDIT: Comme Tinctorius souligne dans un commentaire, vous seriez probablement mieux d'utiliser un enum dans ce cas:

enum LogLevel 
{ 
    Info = 1; 
    Warning = 2; 
    Error = 4; 
    Debug = 8; 
} 

Dans ce cas, vous n'avez pas besoin de préfixer les valeurs du type enum nom, utilisez simplement des variables de ce type. Par exemple:

LogLevel level = Warning; 

Ceci présente l'avantage d'offrir une sécurité de type. Vous pouvez également réutiliser les noms des autres enum s.

+0

'enum' serait mieux ici. –

+0

@Tinctorius Oui, à cet effet ce serait mieux. Je suis en train de mettre à jour ma réponse. – Gorpik

+0

Un autre avantage qu'il offre est qu'un 'const int' pourrait être traité comme une variable globale, en fonction de son utilisation (' int * p = (int *) & Warning; * p = 0'). 'const int's ne sont rien de plus que' int's avec un accès restreint * à travers ce nom *, et un optimiseur doit se convaincre que le stockage sous-jacent n'est jamais changé avant de pouvoir le mettre en ligne. –

Questions connexes