web-dev-qa-db-fra.com

Comment utiliser #pragma message () 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'il ressemble à ceci:

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

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

Mais le __LINE__ la macro semble se développer en int, ce qui interdit l'écriture

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

Y aurait-il une autre façon?

32
xtofl

En voici un qui vous permet de cliquer sur le volet de sortie:

(Il y a aussi d'autres bons conseils là-bas)

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 ceci:

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

Cela créera une sortie comme:

C:\Source\Project\main.cpp (47): Rappel: Résolvez ce problème!

41
RedX

vient de fouetter ceci maintenant, et il bat certainement mon ancienne solution d'utiliser #error :RÉ

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

vous pouvez le modifier comme vous le souhaitez/selon 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

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

8
Necrolis

Ceci est un addendum à la réponse pour ceux qui trouvent fastidieux de frapper #pragma directives à chaque fois qu'ils ont besoin de mettre un signet dans le code: Vous pouvez enregistrer quelques touches en fouettant une macro pour le faire pour vous! Alors qu'en général, vous ne pouvez pas avoir un #pragma directive dans les macros, les compilateurs MS C/C++ 2008 et supérieurs prennent en charge une extension spéciale spécifique au fournisseur appelée __pragma qui peut être utilisé avec des macros. Voir Directives Pragma et mot-clé __Pragma .

J'utilise quotidiennement quelque chose qui ressemble à ce qui suit:

#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 en fonction de vos besoins et ajouter d'autres avertissements. La bonne partie d'un tel système est que vous pouvez activer sélectivement, par exemple, uniquement les éléments de révision de code et ne pas avoir à vous soucier d'autre chose en définissant la macro appropriée dans les paramètres de génération.

3
dirkgently

Sur Visual C++, vous pouvez simplement faire

#pragma message(__FILE__ "(" _CRT_STRINGIZE(__LINE__) ")" ": warning: [blah]")

_CRT_STRINGIZE est souvent déjà défini dans un en-tête, mais si ce n'est pas le cas, vous pouvez le définir:

#define _CRT_STRINGIZE_(x) #x
#define _CRT_STRINGIZE(x) _CRT_STRINGIZE_(x)
2
Mehrdad

Celui-ci permet de l'utiliser sans #pragma (spécifique à Microsoft, je pense) et lorsque vous cliquez dessus, il vous amène à la ligne car il affiche le fichier et le numéro de ligne comme un message d'erreur/d'avertissement normal car aucun des autres ne semble pour faire ça. Cela fonctionnait sans __pragma mais les versions plus récentes de msvc l'exigent. Je l'utilise depuis quelque temps dans 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"

2
Richard V Day

Utilisez le # 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
Jacob