如何使用#pragma message()以便消息指向文件(lineno)?

时间:2011-05-11 15:17:30

标签: c++ visual-studio-2010 pragma line-numbers predefined-macro

为了将“todo”项添加到我的代码中,我想在编译器输出中添加一条消息 我希望它看起来像这样:

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

为了利用Visual Studio构建输出功能通过双击导航到相应的行。

__LINE__宏似乎扩展为int,不允许写

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

会有另一种方式吗?

6 个答案:

答案 0 :(得分:38)

这是一个允许您单击输出窗格的文件:

(还有其他一些不错的提示)

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

一旦定义,请使用如下:

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

这将创建输出,如:

  

C:\ Source \ Project \ main.cpp(47):提醒:解决此问题!

答案 1 :(得分:7)

现在只是掀起了这个,这肯定胜过我使用#error的旧解决方案:D

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

您可以根据自己的需要修改这些内容。 其用法示例:

//in code somewhere
TODO(Fix this);
控制台窗格中的

输出:

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

唯一的缺点是你不能使用__pragma跳转到这一行(通过双击控制台窗格中的消息)(但是使用#pragma测试它似乎不是无论如何......)

答案 2 :(得分:2)

对于那些在每次需要在代码中添加书签时发现#pragma指令很乏味的人来说,这是一个答案的补充:你可以通过将宏添加到一个宏来节省一些按键为你做这个!虽然通常情况下,您不能在宏中使用#pragma指令,但MS C / C ++编译器2008及更高版本确实支持可以与宏一起使用的名为__pragma的特定供应商特定扩展。请参阅Pragma Directives and the __Pragma Keyword

我每天都使用类似于以下内容的东西:

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

您可以轻松扩展它以满足您的需求并添加更多警告。拥有这样一个系统的好处在于,你可以选择性地开启说,只需要代码审查项目,而不必担心在构建设置中设置适当的宏。

答案 3 :(得分:1)

这个允许它在没有#pragma的情况下使用(微软特定的我认为),当你点击它时会带你到线,因为它显示文件和行号就像常规的错误/警告消息一样,因为没有其他人似乎这样做。这曾经在没有__pragma的情况下工作,但较新版本的msvc需要它。自从90年代的某个时候以来我一直在使用它。我使用Visual Studio 2013

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

示例:

Message("Need to add unit testing here")

输出:     1 GT; c:\ source \ include \ mithrilsoftware.h(180):“需要在这里添加单元测试”

答案 4 :(得分:1)

在Visual C ++上,您可以做

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

_CRT_STRINGIZE通常已经在某些标头中定义,但是如果没有,则可以定义它:

#define _CRT_STRINGIZE_(x) #x
#define _CRT_STRINGIZE(x) _CRT_STRINGIZE_(x)

答案 5 :(得分:0)

使用# token。我在MSDN下面发布了一个示例:

// 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")