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

时间:2017-02-01 14:15:08

标签: c++ c macros

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

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

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

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

或简单到位

OUTPUT_ERROR(my_var + "some text");

2 个答案:

答案 0 :(得分:1)

在我看来,你正试图在一个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)

答案 1 :(得分: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