【问题标题】:Using macros in printf function in VS2013 vs VS2017在 VS2013 与 VS2017 的 printf 函数中使用宏
【发布时间】:2017-10-12 13:10:52
【问题描述】:

我已经在我的源代码中定义了这个宏

#define UINT_08X_FORMAT   "%08X"

我需要像这样在 printf 中使用上述内容:

printf("Test - "UINT_08X_FORMAT"", 50);

它在 VS2013 中编译和工作正常,而在 VS2017 中,它会引发以下编译错误。

无效的文字后缀“UINT_08X_FORMAT”;文字运算符或文字 未找到运算符模板“运算符”“UINT32_FORMAT”

如何在 printf 中使用宏。

注意:我不想更改宏定义,因为它可以正常工作 VS2013。我需要一个适用于 VS2013 和 VS2017.

【问题讨论】:

  • 在我的 VS2017 上运行良好。
  • 如果我编译为 C,它在 VS2017 中对我有用,但如果我编译为 C++,我会收到错误。
  • 对不起。它无法在 C++ 上编译。但同样在 VS2013 上成功
  • 你能不能使用#define UINT_08X_FORMAT %08x,然后在字符串本身中使用它?

标签: c++ user-defined-literals


【解决方案1】:

C++11 增加了对用户定义文字 (UDL) 的支持,它通过向其他文字(在本例中为字符串文字)添加后缀来触发。您可以通过在宏名称周围添加空格来克服它,以强制较新的 C++ 编译器将其视为单独的标记而不是 UDL 后缀:

printf("Test - " UINT_08X_FORMAT "", 50);

请参阅http://en.cppreference.com/w/cpp/language/user_literal的此注释:

自从引入了用户定义的字面量,使用的代码 格式化没有空格的固定宽度整数类型的宏常量 在前面的字符串文字变得无效之后: std::printf("%"PRId64"\n",INT64_MIN); 必须替换为 std::printf("%" PRId64"\n",INT64_MIN);

由于最大咀嚼,用户定义的整数和浮点字面量 以 p, P, (C++17 起) e 和 E 结尾,后面跟着运算符 + 或 - 必须与源中带有空格的运算符分开

【讨论】:

  • 为澄清起见,请将printf("Test - "UINT_08X_FORMAT"", 50); 更改为printf("Test - " UINT_08X_FORMAT "", 50);。只需添加空格。
猜你喜欢
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
相关资源
最近更新 更多