我正在尝试在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");
答案 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