【问题标题】:Expanding macro inside raw string在原始字符串中扩展宏
【发布时间】:2013-12-30 23:22:38
【问题描述】:

我想对我的疯狂宏进行一些调试,但没有办法这样做,因为宏生成代码,而不是字符串。我必须更改宏以发出字符串,以便我的程序打印出它本来会产生的代码。

C++11 中的新功能是R"delim("Raw Strings")delim",我希望有一些方法可以在其中一个内插代码宏,以将该代码转换为字符串文字。

【问题讨论】:

  • 我不确定我是否理解。你能举一个你想做的例子吗?比如,“这是一个宏,这就是我想用它做的事情。”
  • 你不能用macro stringification吗?
  • 你们低估了宏的疯狂程度
  • @StevenLu - 如果没有英勇的努力就无法调试宏,那么您需要消除它们。一次编写代码很糟糕!
  • 嗯,它是为超高级(真正的一次编写)调试工具添加通用反射功能的语言。如果不使用宏(3 级深度并生成模板),它字面意思是不可能实现的功能。

标签: c++ string c++11 macros


【解决方案1】:

原始字符串文字的连接方式与普通字符串文字相同。

#define MYMACRO "hello"
std::string blah = R"(first part -)" MYMACRO R"(- second part)";
std::cout << blah;

将输出first part -hello- second part

【讨论】:

    【解决方案2】:

    如果您想调试您的疯狂宏,您可能会从直接检查预处理输出中获得更多信息。任何 C/C++ 编译器都会为此提供一个选项。在 GCC 中是 -E;对于 MSVC,我不记得它的确切位置,但其中一个属性部分具有“保留预处理输出”。执行此操作时,请将#includes 保持在最低限度,尤其是标准库#includes;这些可以在预处理输出的顶部添加数百或数千行代码。

    【讨论】:

    • 仅供参考:对于 VC,它是 /P
    猜你喜欢
    • 2015-09-08
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多