调试宏中的字符串变量扩展

String variable expansion in debug macro

本文关键字:变量 扩展 字符串 调试      更新时间:2023-10-16

我正在尝试在 C 和 C++ 的公共子集中编写调试宏。 这是我到目前为止想出的:

#define OUTPUT_ERROR(...) printf("%s(%d) : %s() : %sn", __FILE__, __LINE__, __func__, #__VA_ARGS__)

不幸的是,我无法弄清楚如何给它输出变量。有没有办法强制变量在运行时扩展?例如:

OUTPUT_ERROR("%s was broken", my_var);

或干脆到位

OUTPUT_ERROR(my_var + "some text");
在我看来

,你试图在一个printf()电话中塞进太多东西。 你不需要这样做。 特别是,为了支持使用,例如您的第一个示例:

OUTPUT_ERROR("%s was broken", my_var);

您可以使用如下所示的宏轻松地将输出拆分为多个printf()调用:

#define OUTPUT_ERROR(...) do { 
  printf("%s(%d) : %s() : ", __FILE__, __LINE__, __func__); 
  printf(__VA_ARGS__); 
  putchar('n'); 
} while (0)

我认为您希望定义一个宏,将一些调试信息添加到格式化日志中。

为此,您可以使用以下宏:

#define LOG(format, ...) 
printf("%s(%d) : %s() " format, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)

这样LOG("%d", 123)将扩展到 printf("%s(%d) : %s() " "%s", __FILE__, __LINE__, __FUNCTION__, 123) .当连续字符串文字被合并时("a" "b"等同于"ab"),printf格式被正确构建。

另请注意使用 , ## __VA_ARGS__ .这是一个GNU扩展(见 https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html),允许空的可变参数。

但是,如果format不是字符串文本,则此技术将失败。请参阅此处的示例:http://ideone.com/gMnaES