How can I use #pragma message() so that the message points to the file(lineno)?

前端 未结 6 887
一生所求
一生所求 2021-01-30 09:01

In order to add \'todo\' items into my code, I want to put a message in the compiler output.
I would like it to look like this:

c:/temp/main.cpp(104): TODO -         


        
相关标签:
6条回答
  • 2021-01-30 09:27

    just whipped this up now, and it sure beats my old solution of using #error :D

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

    you can modify this how ever you like/to whatever suits your needs. An example of its usage:

    //in code somewhere
    TODO(Fix this);
    

    output in the console pane:

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

    only downside is you can't jump to the line of this (by double clicking the message in the console pane) using __pragma (but testing with #pragma it doesn't seem to be the case anyways...)

    0 讨论(0)
  • 2021-01-30 09:29

    Here is one that allows you to click on the output pane:

    (There are also some other nice tips there)

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

    Once defined, use like so:

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

    This will create output like:

    C:\Source\Project\main.cpp(47): Reminder: Fix this problem!

    0 讨论(0)
  • 2021-01-30 09:33

    This one allows it to be used without #pragma (Microsoft specific I think) and when you click it takes you to the line since it shows the file and line number just like a regular err/warning message does since none of the other ones seem to do this. This used to work without the __pragma but newer versions of msvc require it. Ive been using it since sometime in the 90's. I use Visual Studio 2013

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

    example :

    Message("Need to add unit testing here")
    

    output: 1> c:\source\include\mithrilsoftware.h(180) :"Need to add unit testing here"

    0 讨论(0)
  • 2021-01-30 09:34

    This is an addendum to the answer for those who find it tedious to punch in #pragma directives every-time they need to put a bookmark in the code: You can save a few keystrokes by whipping up a macro to do this for you! While in general, you cannot have a #pragma directive within macros, MS C/C++ compilers 2008 and above do support a special vendor-specific extension called the __pragma which can be used with macros. See Pragma Directives and the __Pragma Keyword.

    I use something akin to the following on a daily basis:

    #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();
    }
    

    You can easily extend it to suit your needs and add more warnings. The good part of having such a system is that you can selectively turn-on say, only code-review items and not have to worry about anything else by setting the appropriate macro in the build settings.

    0 讨论(0)
  • 2021-01-30 09:36

    Use the # token. I've posted an example from MSDN below:

    // 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 讨论(0)
  • 2021-01-30 09:48

    On Visual C++ you can just do

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

    _CRT_STRINGIZE is often already defined in some header, but if it's not, you can define it:

    #define _CRT_STRINGIZE_(x) #x
    #define _CRT_STRINGIZE(x) _CRT_STRINGIZE_(x)
    
    0 讨论(0)
提交回复
热议问题