【问题标题】:Custom #pragma message warning will instantiation trace自定义#pragma 消息警告将实例化跟踪
【发布时间】:2021-06-21 03:54:51
【问题描述】:

我有一个基本的#pragma 消息警告

#pragma message(__FILE__ "(" _CRT_STRINGIZE(__LINE__) ") : warning : T does not have an << operator.")

这是在 Sfinae 控制的过载测试中,用于检测

但是它缺少“本机”警告和错误提供的额外信息:

[ with T = int ]

还有额外的堆栈/实例化跟踪,让您可以准确确定是哪个函数调用导致了问题。

有没有办法让我的警告也显示这些额外有用的信息,因为我的警告甚至无法告诉用户是什么类型触发了警告,更不用说哪个代码/方法调用部分导致了警告。

__PRETTY_FUNCTION__ 例如在 #pragma 消息中不起作用,因为它是一个 const char[] 并且 #pragma 消息需要一个常量字符串,即“bla bla”。

【问题讨论】:

    标签: c++ visual-studio warnings pragma


    【解决方案1】:

    有点非正统,但您可以在 SFINAE 控制的重载前使用 [[deprecated("...")]] 来获取有关实际类型和调用堆栈的信息。

    【讨论】:

    • 我已经看到过使用过时的警告,这可能是最后的手段,但它不是一个明确的警告,即使与我自己的警告结合使用,它也可能会使课程的用户感到困惑。
    【解决方案2】:

    我建议你可以参考这个link

     // 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): Reminder: Fix this problem!
    

    此外,虽然一般情况下,您不能在宏中使用 #pragma 指令,但 MS C/C++ 编译器 2008 及更高版本确实支持称为 __pragma 的特殊供应商特定扩展,可与宏一起使用。

    【讨论】:

    • 我的消息已经可以做到这一切。行号不是问题,问题在于这是实用程序类深处的模板化方法。对于使用此类的开发人员来说,给出这个行号并没有多大用处。当内置错误或警告与[ with T = double ] 信息一起出现时,如果您在 VS 的输出视图中看到相同的实例化堆栈,对他们来说会更有用。
    • 根据你的描述,好像只有deprecated这个方法可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2013-12-07
    • 2014-02-27
    相关资源
    最近更新 更多