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

Dev*_*lar 1 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__ ); \
                      }
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下都可以正常工作 - 如果测试用例评估为真,则不会发生任何事情。如果测试用例评估为假,则打印测试用例,包括文件名和行号。

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

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

迷茫,不知所措。帮助?

Adr*_*son 5

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

printf( "FAILED: %s, line %d - %s\n", __FILE__, __LINE__, #x );
Run Code Online (Sandbox Code Playgroud)

#转换参数到正确的双引号分隔字符串,所以没有什么能阻止你通过这个字符串作为参数传递给printf的...

(你永远不应该使用任何不是硬编码的值作为 printf 的格式字符串:大多数时候这会引起地狱)