带有可选参数的 C++ 和 MSVC #define 指令
C++ and MSVC #define directive with optional arguments
我在尝试让我编写的宏正常运行时遇到问题。我已经阅读了文档,但无法在网上找到任何可以帮助我查找的内容。
我正在尝试编写一个用于信息和调试目的的宏。确切的宏应该如下所示:
INFODUMP("Some format string here with a variable %f", someVariableInCode);
这将扩展为:
std::printf("INFO: Some format string here with a variable %f\n" someVariableInCode);
我写的不能正常运行的宏是:
#define INFODUMP(s, ...) std::printf("INFO: %s\n", s, __VA_ARGS__)
虽然从技术上讲,此宏可以正常运行,但它不会执行 格式设置。
比如我有:
INFODUMP("Size of width buffer: %i, size of height buffer: %i", wCells.size(), hCells.size());
当程序为 运行 时,在控制台中,我得到:
INFO: Size of width buffer: %i, size of height buffer: %i
所以宏 有效 ,它只是没有格式化字符串。这有点像用 s 正确格式化它,但之后没有任何可选参数。
如果我不得不猜测的话,它与字符串以及它们在运行时的格式化方式有关。如果是这样的话,我仍然完全不知道要查找什么。
备注:
- 我正在使用带有 Visual C++ (v143) 编译器(最新)的 Visual Studio 2022 社区。
- 在网上进行研究时,
__VA_OPT__
预处理器变量不再存在,我不相信,但我可能完全错了。
那不是 printf()
的工作方式。
您的宏展开:
INFODUMP("%d", 42);
收件人:
std::printf("INFO: %s\n", "%d", 42)
你需要:
#define INFODUMP(s, ...) std::printf("INFO: " ## s ## "\n", __VA_ARGS__)
然后将展开:
INFODUMP("%d", 42);
收件人:
std::printf("INFO: %d\n", 42)
我在尝试让我编写的宏正常运行时遇到问题。我已经阅读了文档,但无法在网上找到任何可以帮助我查找的内容。
我正在尝试编写一个用于信息和调试目的的宏。确切的宏应该如下所示:
INFODUMP("Some format string here with a variable %f", someVariableInCode);
这将扩展为:
std::printf("INFO: Some format string here with a variable %f\n" someVariableInCode);
我写的不能正常运行的宏是:
#define INFODUMP(s, ...) std::printf("INFO: %s\n", s, __VA_ARGS__)
虽然从技术上讲,此宏可以正常运行,但它不会执行 格式设置。
比如我有:
INFODUMP("Size of width buffer: %i, size of height buffer: %i", wCells.size(), hCells.size());
当程序为 运行 时,在控制台中,我得到:
INFO: Size of width buffer: %i, size of height buffer: %i
所以宏 有效 ,它只是没有格式化字符串。这有点像用 s 正确格式化它,但之后没有任何可选参数。
如果我不得不猜测的话,它与字符串以及它们在运行时的格式化方式有关。如果是这样的话,我仍然完全不知道要查找什么。
备注:
- 我正在使用带有 Visual C++ (v143) 编译器(最新)的 Visual Studio 2022 社区。
- 在网上进行研究时,
__VA_OPT__
预处理器变量不再存在,我不相信,但我可能完全错了。
那不是 printf()
的工作方式。
您的宏展开:
INFODUMP("%d", 42);
收件人:
std::printf("INFO: %s\n", "%d", 42)
你需要:
#define INFODUMP(s, ...) std::printf("INFO: " ## s ## "\n", __VA_ARGS__)
然后将展开:
INFODUMP("%d", 42);
收件人:
std::printf("INFO: %d\n", 42)