提问人:uhsl_m 提问时间:3/24/2021 更新时间:3/25/2021 访问量:349
自定义 #pragma 消息警告将实例化跟踪
Custom #pragma message warning will instantiation trace
问:
我有一个基本的 #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”。
答:
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
评论