gpt4 book ai didi

在运行时检查宏是否已定义

转载 作者:行者123 更新时间:2023-11-30 14:52:55 25 4
gpt4 key购买 nike

在开发静态库的过程中,遇到了测试库函数的需要。功能检查不是问题。主要问题是测试库提供的每个宏定义。

我从这样的代码开始

/* 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] 的值一样。 .

到目前为止,我不知道如何以这种方式测试类似函数的宏,但我认为与其他人分享这个无论如何都会有用。

关于在运行时检查宏是否已定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47491147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com