【问题标题】:Can a c++ variadic macro read arguments spread over multiple lines?c++ 可变参数宏可以读取分布在多行的参数吗?
【发布时间】:2021-12-20 20:40:49
【问题描述】:

我正在尝试捕获 std::format 样式消息以供在 VS2019 中使用:

#define MyFunc(...) MsgProcessing( std::format( __VA_ARGS__ ) );

只要消息适合程序中的一行,就可以完美地工作。但是,如果消息在后续行上继续,则 if 似乎省略号无法理解继续到右括号,并在第一行的末尾停止,从而导致可预测的错误。

有谁知道捕获多行调用的方法,例如:

MyFunc( "{} {}",
"Hello",
"world" );

谢谢!

我刚刚尝试了自己的完全简化的示例,并且正如预期的那样,它运行良好。其他地方必须有一些交互来阻止它在更大的系统中工作(它有很多第三方包含)。一个奇怪的症状,但我会以不同的方式前进。感谢您的所有帮助!

【问题讨论】:

  • 您是否可能不小心在字符串文字中间断了行?
  • 你为什么要这个?
  • @TedLyngmo 因为每次你想记录一些东西时输入MsgProcessing(std::format(........)) 很乏味?
  • @M.M 对于使用__LINE__ 等的日志记录,我可以看到宏的使用,但这看起来像一个普通函数?类似template<class... Args> decltype(auto) MyFunc(Args&&... args) { return MsgProcessing( std::format(std::forward<Args(args)...) );

标签: c++ visual-studio-2019 c++20


【解决方案1】:

我已经在 VS2019 和 VS2022 中测试了您的宏,但无法重现该问题 - 但也就是说,它是一个宏,并且可能以我无法发现的方式脆弱。

我建议以函数模板的形式进行替换。无论您如何断行,这都会正常工作 - 只要您使用的语法是正确的。

#include <format>
#include <utility>

template<class... Args>
decltype(auto) MyFunc(Args&&... args) {
    return MsgProcessing(std::format(std::forward<Args>(args)...));
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多