代码之家  ›  专栏  ›  技术社区  ›  DevSolar

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

  •  0
  • DevSolar  · 技术社区  · 14 年前

    在我的项目中(出于技术原因,不能依赖任何外部库或第三方来源),我设置了以下内容 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() 在testcase宏中,坚持将字符串文字解释为格式字符串的一部分(这对于特定的testcase来说是致命的)。

    现在我正在考虑各种方法来获得 Primff() 打印任何内容 x (测试用例)一字不差,但我空出来了。最接近的是使用 %c 打印固定数量的字符并传递文本框( #x )作为参数 Primff() -但我不知道如何确定 阿克斯 尤其是如果它包含零字节(这排除了使用 strlen() )

    迷茫,茫然不知所措。帮助?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Adrien Plisson    14 年前

    用什么呢 %s 作为一种格式,然后将字符串化测试用例作为一个参数传递,就像对行号那样?

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

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

    (您不应该使用任何没有硬编码的值作为printf的格式字符串:这在大多数情况下都会让人很痛苦)