2011-08-17 2 views
2

J'ai besoin d'une macro pour développer un commentaire C++, est-ce possible?Macro C++ sans espace

J'ai ceci:

#define SLASH(x,y) x y 
#define OUT SLASH(/,/) 

int main(int argc, char *argv[]) 
{ 
    OUT << "text"; 
    return 0; 
} 

Et besoin d'étendre à ceci:

{ 
    // << "text"; 
    return 0; 
} 

J'ai aussi essayé ceci:

#define SLASH(x) /x 
#define OUT SLASH(/) 

Mais le résultat est toujours le même:

int main(int argc, char *argv[]) 
{ 
// << "text"; 
    return 0; 
} 
+3

Qu'est-ce que vous essayez de faire exactement? Pourquoi avez-vous besoin de cela? –

Répondre

1

Comme mentionné précédemment, il n'existe aucun moyen garanti de définir le type de macro que vous recherchez. D'autres façons d'obtenir des résultats similaires à ceux que vous essayez d'obtenir sont d'encapsuler votre instruction de sortie dans un bloc conditionnel ou de définir un flux de sortie personnalisé qui a simplement ignoré toutes les sorties. Les deux approches peuvent même être combinées afin que le comportement puisse être changé en changeant une seule définition de macro.

+0

Merci pour un indice :). Je l'ai fait comme ceci: #define OUT if (0) qDebug() – Samuel

+0

Ca va casser à la mode macro typique. Considérons "if (x) OUT <<" test réussi ", sinon exit (0);" . Cela va maintenant toujours sortir si le test passe au lieu d'imprimer quelque chose. – dascandy

+0

Vous pouvez corriger cela de manière "intelligente" en faisant "#define OUT if (1) true, ou qDebug()". Je ne suis pas sûr que ce soit fiable ou quoi que ce soit, mais au moins vous vous êtes débarrassé de l'autre. – dascandy

5

Non, ce n'est pas possible car les commentaires C++ sont supprimés avant le développement des macros.

(voir 2.1 de la norme, la suppression de commentaires se produit en phase 3, l'expansion macro en phase 4.)

+0

vérifier ma réponse –

+0

Merci, vous m'avez aidé: – Samuel

1

Les commentaires sont supprimés à partir du code source avant l'exécution de préprocesseur. Donc tu ne peux pas faire ça.

+0

vérifier ma réponse –

+0

@LuchianGrigore: Que voulez-vous dire par "ça marche"? –

+0

La ligne après la macro est traitée comme un commentaire ... –

2

Qu'en est-il de le remplacer par un objet fonction qui ne fait rien à la place?

static class NullOutput { 
public: 
    template <typename T> 
    const NullOutput &operator<<(T arg) const { 
     return *this; 
    } 
} NullOutputObj; 

#define OUT NullOutputObj 

Le résultat net est que l'objet est retiré du code et remplacé par des extensions de modèle inlined, qui sont ensuite optimisés comme ils ne font rien. Le résultat est absolument pas de surcharge de code.

0

une alternative à ce que vous voulez atteindre serait ceci:

http://donjaffer.blogspot.in/2012/09/dprintf-debug-macro-in-c.html

#define DEBUG // comment if you do not want the debug statments to appear. 

#ifdef DEBUG 
#define DPRINTF(fmt, ...) \ 
    do { printf("my_file: " fmt, ## __VA_ARGS__); } while (0) 
#else 
#define DPRINTF(fmt, ...) \ 
    do { } while (0) 
#endif 

où que vous essayez d'imprimer les déclarations, au lieu de COUT < < vous pouvez utiliser

DPRINTF("Your text here\n");