【问题标题】:Printing macro fails to concatenate [duplicate]打印宏无法连接[重复]
【发布时间】:2018-12-26 07:37:24
【问题描述】:

我想创建一个宏来打印一些信息并在需要时使用任意数量的参数来打印其他消息。

这里有一段代码 sn-p 我正在谈论:

#include <stdio.h>

#define print(msg, ...) \
    printf("Line: %d File %s "## msg, __LINE__ , __FILE__, __VA_ARGS__);

int main()
{
    print("Msg: %d", 13);
    print("Msg: %d, Msg2: %d", 123, 234);
}

这是我得到的一个错误:

main.cpp:12:9: error: pasting ""Line: %d File %s "" and ""Msg: %d"" does not give a valid preprocessing token
  printf("Line: %d File %s "## msg, __LINE__ , __FILE__, __VA_ARGS__);

我做错了什么?

【问题讨论】:

  • 你为什么要写 C 代码并假装它是 C++?
  • @paxdiablo 文件名是main.cpp,所以我认为是C风格的C++代码。
  • @mch: 是的,因此我的评论中的“假装”子句 :-) C 风格的 C++ 代码,正如您雄辩地指出的那样,可能是您 worst 的事情可以做学习C++。话虽如此,它是main.cpp 确实这一事实表明 C++,所以我将恢复 C++ 标记(并删除 C 标记) - 一个问题应该同时具有两者的情况非常罕见。

标签: c++ macros


【解决方案1】:

C 字符串文字是自动连接的。您现在拥有的 ## 旨在将两个“令牌”(不是字符串)合并为一个,例如将ABCXYZ 设为ABCXYZ 作为标识符。

你想要这个:

printf("Line: %d File %s " msg, __LINE__ , __FILE__, __VA_ARGS__);

【讨论】:

    【解决方案2】:

    正如它在锡上所说的那样:"Line: %d File %s ""Msg: %d" 不是一个单一的、有效的预处理令牌,因为需要## 来生成。

    只需删除##,因为相邻的字符串文字已经被预处理器连接起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-03
      • 2017-09-05
      • 2015-04-08
      • 1970-01-01
      • 2017-01-18
      • 2018-09-11
      • 2023-01-23
      • 1970-01-01
      相关资源
      最近更新 更多