如何使printf()正确地从宏内打印二进制blob?
问题描述:
在我的项目(因技术原因不能依赖于任何外部库或第三方来源)我已经设置了以下test.h
:如何使printf()正确地从宏内打印二进制blob?
static int rc = 0;
#define TESTCASE(x) if (x) {} \
else \
{ \
rc += 1; \
printf("FAILED: " __FILE__ ", line %d - " #x "\n", __LINE__); \
}
也能正常工作的大部分时间 - 如果测试用例评估为真,没有任何反应。如果测试用例评估为false,则打印测试用例包括文件名和行号。
但是,当测试用例包含字符串文字时,TESTCASE宏中的printf()
坚持将字符串字面解释为格式字符串的一部分(这对于某个测试用例来说是致命的)。
现在我正在想方设法让printf()
逐字打印x
(测试用例)中的任何内容,但我已经空了。最接近的是使用%c
打印固定数量的字符,并将文本(#x
)作为参数传递给printf()
- 但我无法弄清楚如何确定#x
的大小,特别是如果它包含零字节(其中排除任何使用strlen()
)。
困惑,无所适从。帮帮我?
答
那么如何使用%s
作为格式,然后将字符串化测试用例作为参数传递,就像您对行号所做的那样?
printf("FAILED: %s, line %d - %s\n", __FILE__, __LINE__, #x);
的#
参数转换为正确的双引号分隔字符串,所以没有什么能阻止你通过这个字符串作为参数传递给printf ...
(你永远不应该使用任何价值没有硬编码为printf的格式字符串:这大部分时间都提高了地狱)
一个很好的第一个appriach,但是如果#x中的字符串文字包含零字节呢? – DevSolar 2010-06-24 09:36:13
我不认为这是可能的:零字节没有表示,它在C源文件中无效,因此不能出现在你的测试用例中。 (或者在你的问题中'TEST_CASE'宏的定义是错误的),请记住'#'预处理器运算符是一个字符串化器,它会将'abc'转换为''abc“'在宏参数中直接出现的字符串。 – 2010-06-24 09:48:42
我在这里输入了一半的内容“嘿,我意识到'\ 0'是零字节的*表示*,而不是事物本身,我可以随时将字符串'\ 0'写入字符串'。 AAaaargh ......我的大脑一半已经睡着了。当然,你绝对是对的。 – DevSolar 2010-06-24 09:51:03