自定义 #pragma 消息警告将实例化跟踪

Custom #pragma message warning will instantiation trace

提问人:uhsl_m 提问时间:3/24/2021 更新时间:3/25/2021 访问量:349

问:

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

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

这是在 Sfinae 控制的过载测试中,用于是否存在<<操作员。此警告有效,并打印到输出窗口并添加到 VS2019 中的错误列表中。

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

[ with T = int ]

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

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

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

C++ Visual-Studio 警告杂

评论


答:

0赞 m88 3/24/2021 #1

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

评论

0赞 uhsl_m 3/25/2021
我已经看到使用已弃用的警告,这可能是最后的手段,但它不是一个明确的警告,即使与我自己的警告配对,它也可能会使该类的用户感到困惑。
0赞 Barrnet Chou 3/25/2021 #2

我建议你可以参考这个链接

 // 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!

此外,虽然一般来说,宏中不能有指令,但 MS C/C++ 编译器 2008 及更高版本确实支持一个特殊的特定于供应商的扩展,称为 可以与宏一起使用。#pragma__pragma

评论

0赞 uhsl_m 3/25/2021
我的信息已经可以做到这一切。行号不是问题,问题是这是实用程序类中深入的模板化方法。对于使用此类的开发人员来说,提供此行号没有多大用处。对他们来说,当内置错误或警告与信息一起发生时,查看您在 VS 的输出视图中获得的相同实例化堆栈会更有用。[ with T = double ]
0赞 Barrnet Chou 3/26/2021
根据您的描述,似乎只有这种方法可用。deprecated