调试宏中的字符串变量扩展
String variable expansion in debug macro
我正在尝试在 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
相关文章:
- 扩展可变参数模板中的变量名称
- c++ 变量在宏的扩展中没有在这个范围内声明
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- PHP-CPP 扩展,它跨页面保留变量的值
- 如何将矢量大小扩展一个元素并用变量填充它
- QProcess::执行环境变量扩展字符串
- 如何使用静态变量,使用自定义Getter和设置器在SWIG中扩展结构
- 如何基于模板变量参数多次扩展语句
- 调试宏中的字符串变量扩展
- 生成文件 :从变量中按扩展名选择文件
- 如何在不扩展的情况下基于 RHIDE 中的环境变量添加包含目录
- 如何从 Python 扩展检查输入变量的有效性
- 与 Makefile 中的变量扩展混淆
- 如何在C++中扩展包含环境变量的路径
- 静态变量的参数包扩展
- 扩展QMessageBox类时,如何访问QMessageBoxPrivate中的标签变量
- C++在私有扩展后将变量变成公共变量
- 是否可以C++引用扩展到多个变量
- 未扩展常量引用变量的生存期
- 如何使用Boost扩展.ini文件中的环境变量