如何使printf()从宏中正确打印二进制blob?

时间:2010-06-24 09:15:49

标签: c macros printf

在我的项目中(出于技术原因,不得依赖任何外部图书馆或第三方来源)我已设置以下test.h

static int rc = 0;
#define TESTCASE( x ) if ( x ) {} \
                      else \
                      { \
                          rc += 1; \
                          printf( "FAILED: " __FILE__ ", line %d - " #x "\n", __LINE__ ); \
                      }

大部分时间都可以正常工作 - 如果测试用例评估为true,则没有任何反应。如果测试用例的计算结果为false,则打印测试用例,包括文件名和行号。

但是,当测试用例包含字符串文字时,TESTCASE宏中的printf()坚持将字符串文字解释为格式字符串的一部分(对于某个测试用例来说这是致命的)。

现在我正在考虑各种方法让printf()逐字打印x(测试用例)中的内容,但我已经空了。最接近的是使用%c打印固定数量的字符,并将文本案例(#x)作为参数传递给printf() - 但我无法弄清楚如何确定大小#x,特别是如果它包含零字节(排除使用strlen())。

困惑,不知所措。帮助

1 个答案:

答案 0 :(得分:3)

如何使用%s作为格式,然后将字符串化的测试用例作为参数传递,就像您对行号一样?

printf( "FAILED: %s, line %d - %s\n", __FILE__, __LINE__, #x );

#将参数转换为正确的双引号分隔字符串,因此没有什么可以阻止您将此字符串作为参数传递给printf ...

(你不应该使用任何非硬编码的值作为printf的格式字符串:大部分时间都在提高地狱性)