Comment puis-je utiliser le message #pragma() pour que le message pointe vers le fichier(lineno)?

afin d'ajouter des éléments 'todo' dans mon code, je veux mettre un message dans la sortie du compilateur.

Je voudrais qu'elle ressemble à ceci:

c:/temp/main.cpp(104): TODO - add code to implement this

afin d'utiliser la fonctionnalité de sortie de Visual Studio build pour naviguer vers la ligne respective en double-cliquant dessus.

Mais __LINE__ macro semble étendre à un int, qui interdit l'écriture

#pragma message( __FILE__ "("__LINE__"): ..." )

y Aurait-il un autre moyen?

29
demandé sur xtofl 2011-05-11 19:17:30

5 réponses

Ici est celui qui vous permet de cliquer sur le volet de sortie:

(Il y a aussi quelques autres conseils sympas)

http://www.highprogrammer.com/alan/windev/visualstudio.html

 // Statements like:
 // #pragma message(Reminder "Fix this problem!")
 // Which will cause messages like:
 // C:\Source\Project\main.cpp(47): Reminder: Fix this problem!
 // to show up during compiles. Note that you can NOT use the
 // words "error" or "warning" in your reminders, since it will
 // make the IDE think it should abort execution. You can double
 // click on these messages and jump to the line in question.

 #define Stringize( L )     #L 
 #define MakeString( M, L ) M(L)
 #define $Line MakeString( Stringize, __LINE__ )
 #define Reminder __FILE__ "(" $Line ") : Reminder: "

une fois défini, utilisez comme suit:

#pragma message(Reminder "Fix this problem!") 

cela va créer une sortie comme:

37
répondu RedX 2016-05-12 06:34:09

juste fouetté cela en haut maintenant, et il bat certainement ma vieille solution de l'utilisation #error :D

#define _STR(x) #x
#define STR(x) _STR(x)
#define TODO(x) __pragma(message("TODO: "_STR(x) " :: " __FILE__ "@" STR(__LINE__)))

vous pouvez modifier ceci comment jamais vous aimez / à tout ce qui convient à vos besoins. Un exemple de son utilisation:

//in code somewhere
TODO(Fix this);

sortie dans le volet de la console:

1>TODO: Fix this :: c:\users\administrator\documents\visual studio 2008\projects\metatest\metatest\metatest.cpp@33

seul l'inconvénient est que vous ne pouvez pas sauter à la ligne de ceci (en double cliquant le message dans le volet de la console) en utilisant __pragma(mais avec#pragma il ne semble pas être le cas de toute façon...)

7
répondu Necrolis 2016-12-19 16:38:10

ceci est un addenda à la réponse pour ceux qui trouvent fastidieux de pointer #pragma directives à chaque fois qu'ils ont besoin de mettre un signet dans le code: vous pouvez sauver quelques frappes en fouettant une macro pour le faire pour vous! Bien qu'en général, vous ne pouvez pas avoir un #pragma directive within macros, MS C / C++ compilers 2008 and above supporte une extension spécifique au fournisseur appelée __pragma qui peut être utilisé avec des macros. Voir les Directives Pragma et le Pragma Mot-clé.

j'utilise quelque chose de semblable à la suivante sur une base quotidienne:

#define STR2(x) #x
#define STR1(x) STR2(x)
#define LOC __FILE__ "("STR1(__LINE__)") : Warning Msg: "
#define WARNING_BUILDER(x) __FILE__ "("STR1(__LINE__)") : Warning Msg: " __FUNCTION__ " requires " #x
#define WREVIEW WARNING_BUILDER(review)
#define WUT WARNING_BUILDER(unit-testing)

#ifdef SPECIAL_WARNINGS
    #ifdef SPECIAL_WARNINGS_REVIEW
        #define MARK_FOR_REVIEW() do { \
                    __pragma(message( WREVIEW )) \
                } while (0)
    #else
        #define MARK_FOR_REVIEW 
    #endif

    #ifdef SPECIAL_WARNINGS_UNIT_TEST
        #define MARK_FOR_UNIT_TEST() do { \
                    __pragma(message( WUT )) \
                } while (0)
    #else
        #define MARK_FOR_UNIT_TEST 
    #endif
#endif


// uncomment/set in build-environment to enable special warnings
//#define SPECIAL_WARNINGS
#ifdef SPECIAL_WARNINGS
// uncomment/set in build-environment if you want only code review warnings
//#define SPECIAL_WARNINGS_REVIEW
// uncomment/set in build-environment if you want only unit-test warnings
//#define SPECIAL_WARNINGS_UNIT_TEST
#endif

int main()
{
MARK_FOR_REVIEW();
MARK_FOR_UNIT_TEST();
}

vous pouvez facilement l'étendre pour répondre à vos besoins et ajouter plus d'Avertissements. La bonne partie d'avoir un tel système est que vous pouvez sélectivement activer, par exemple, seulement les éléments de révision de code et ne pas avoir à vous soucier de quoi que ce soit d'autre en définissant la macro appropriée dans les paramètres de construction.

2
répondu dirkgently 2014-04-25 08:36:25

celui-ci permet de l'utiliser sans #pragma (spécifique à Microsoft je pense) et quand vous cliquez il vous emmène à la ligne car il montre le dossier et le numéro de ligne tout comme un message d'erreur/avertissement régulier fait depuis aucun des autres semblent faire cela. Cela fonctionnait sans _ _ pragma, mais les nouvelles versions de msvc l'exigent. Je l'utilise depuis les années 90. J'utilise Visual Studio 2013

#define MacroStr(x)   #x
#define MacroStr2(x)  MacroStr(x)
#define Message(desc) __pragma(message(__FILE__ "(" MacroStr2(__LINE__) ") :" #desc))

exemple :

Message("Need to add unit testing here")

sortie: 1> c:\source\include\mithrilsoftware.h(180) :"Besoin d'ajouter des tests unitaires ici"

1
répondu Richard V Day 2013-11-01 21:38:35

# jeton. J'ai posté un exemple de MSDN ci-dessous:

// collisions.h
#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __LOC__ __FILE__ "("__STR1__(__LINE__)") : Warning Msg: "

// collisions.cpp
#pragma message(__LOC__"Need to do 3D collision testing")
0
répondu Jacob 2011-05-11 15:22:14