在VS2013与VS2017的printf函数中使用宏

Using macros in printf function in VS2013 vs VS2017

本文关键字:函数 printf VS2013 VS2017      更新时间:2023-10-16

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

#define UINT_08X_FORMAT   "%08X"

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

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

它在VS2013中编译并工作正常,而在VS2017中,它会抛出以下编译错误。

无效的文本后缀"UINT_08X_FORMAT";文本运算符或文本 未找到运算符模板"运算符"UINT32_FORMAT"

如何在 printf 中使用宏。

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

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 结尾,后跟运算符 + 或 -,必须与运算符分隔,并在源中使用空格