在开发静态库的过程中,遇到了测试库函数的需要。
功能检查不是问题。主要问题是测试库提供的每个宏定义。
我从这样的代码开始
/* For non-vital macro (OS/WORDSIZE detections) */
# if defined(BXI_ARCH_X32)
printf(" defined : BXI_ARCH_X32\n");
# endif
# if defined(BXI_ARCH_X64)
printf(" defined : BXI_ARCH_X64\n");
# endif
<...>
/* For vital macro */
#if defined(BXI_OS)
printf(" defined : BXI_OS : \"%s\"\n", BXI_OS);
#else
print_failed();
#endif
#if defined(BXI_BITS)
printf(" defined : BXI_BITS: %d\n", BXI_BITS);
#else
print_failed();
#endif
#if defined(BXI_ARCH)
printf(" defined : BXI_ARCH: \"%s\"\n", BXI_ARCH);
#else
print_failed();
#endif
这很酷,但非常耗时。我想要一个可以为我生成代码的工具,或者一些可以让我通过宏自动生成测试的技巧,如下所示
TEST_MACRO(BXI_OS)
但是,如您所知,宏定义无法生成#if/#else/#endif 指令。
我需要一个解决方案,不仅可以检查宏是否在运行时定义,还可以将其值打印到输出。
我遇到了类似的问题,并找到了另一个很好的技巧来实现你的TEST_BXI_MACRO_EXISTS
没有string.h
和额外的函数调用:
#define STRINGIZE_I(x) #x
#define TEST_BXI_MACRO_EXISTS(name) (#name [0] != STRINGIZE_I(name) [0])
此技巧使用相同的假设,即定义的宏的字符串化值与该宏的字符串化名称不匹配。但对于我的情况,我只需要检查宏是否被定义为数字常量、字符串文字或空值。没有类似函数的宏和其他东西。
它是这样工作的:
#define MACRO "Content"
TEST_BXI_MACRO_EXISTS(MACRO)
// translates to ("MACRO"[0] != "\"Content\""[0])
// first letter of a valid macro name can never be equal to '"'
#define MACRO 3.14
TEST_BXI_MACRO_EXISTS(MACRO)
// translates to ("MACRO"[0] != "3.14"[0])
// first letter of a valid macro name can never be equal to a digit
#define MACRO
TEST_BXI_MACRO_EXISTS(MACRO)
// translates to ("MACRO"[0] != ""[0])
// first letter of a valid macro name can never be equal to a '\0'
这种方法还可以轻松地用于测试宏是否定义了数字常量、字符串文字或空值,就像您的方法一样,通过检查STRINGIZE_I(name) [0]
.
到目前为止,我不知道如何以这种方式测试类似函数的宏,但我认为与其他人分享这个无论如何都是有用的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)