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

2024-01-02

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

我从这样的代码开始

/* 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(使用前将#替换为@)

在运行时检查宏是否已定义 的相关文章

随机推荐

  • 如何通过互操作公开 COM 库中定义的枚举作为 C# 函数的返回类型

    希望问题很清楚 但为了清楚起见 请补充一下 我有一个 VB6 dll 它定义了我在 C dll 中引用的枚举 C dll 使用 idispatch 接口以正确的方式定义 CCW 该接口声明返回类型为枚举的函数 运行 regasm 时 我收到
  • Python 3 字符串索引查找是 O(1)?

    短篇故事 Python 3 unicode 字符串查找是 O 1 还是 O n 很长的故事 C char 数组中字符的索引查找是常数时间 O 1 因为我们可以确定地跳转到连续的内存位置 const char mystring abcdef
  • “git checkout ”正在将分支更改为“无分支”

    我正在 git 的一个分支上工作 当我做 git checkout
  • constexpr 中的“整数常量溢出”警告

    我正在尝试找到一个与 constexpr 兼容的哈希函数 用于在编译时对字符串进行哈希处理 字符串的数量非常少 static constexpr unsigned int Fnv1aBasis 0x811C9DC5 static const
  • 使用密钥加密和解密的简单方法[重复]

    这个问题在这里已经有答案了 我正在寻找一种简单的方法来使用固定密钥 将存储在我的配置中 加密和解密一些数据并将结果存储为字符串 base16 或十六进制 就像是 string myString hello world string myKe
  • centos 6 中gfortran编译器的安装

    我尝试安装一些编译器 我的笔记本电脑使用的是 Centos 6 我已经安装了 gcc 即 GNU C 编译器 我还需要安装 gfortran 但是当我输入时yum install gfortran 我收到消息no package gfort
  • 无法让 XPath 单击 selenium 中的弹出窗口

    我正在尝试从 SEC 中提取一些简单的 CIK 代码 如果运行下面的代码 您将收到有关 调查 的弹出消息 如果您手动执行 您将看不到它 它轰炸了我的代码 但由于它是在硒中 我无法使用 chropath 检查它以使 xpath 单击 NO 我
  • 如何使用 Java3D API 在 java 中绘制简单的 3D 点(x,y,z)?

    我正在使用 Java 技术在 netbeans 平台上制作一个桌面应用程序 我做了一些图像处理 数据库功能 图像捕获过程 但现在我想在 3D 视图中绘制图像 所以 我想首先我必须制作 tiff 16 位灰度图像的点数组 然后使用这个点数组
  • 根据环境设置 angularjs 项目中的基本 URL

    我正在开发一个使用 Yeoman 创建的 AngularJs 项目 该项目使用 Grunt 作为任务管理器 在我的 index html 中 我需要设置基本 url href属性值取决于环境 如果环境是开发我希望href简单 如果环境是生产
  • 使用 socket.io-redis 的示例

    大家好 感谢您的时间和帮助 我需要一个使用socket io redis的简单示例 请发表评论 我阅读了文档 但我不明白 谢谢你 socket io redis 文档没有提到您实际上需要运行 redis 服务器 因此您可能已经忘记了这一点
  • Magento 2 - 未找到请求的组件(“0”)。使用前必须添加实现

    嗨 Magento 专家朋友们 最近我已将 magento 1 迁移到 Magento 2 2 1 0 版本 拥有9000种产品和20000个订单 我使用 Magento 迁移工具进行迁移 到目前为止 一切都很好 除了 未找到所请求的组件
  • roxygen2 如何不运行示例文件

    我很清楚当代码直接位于 roxygen 注释中时如何让 roxygen 不运行示例 但是 某些示例可能有点冗长 或者您希望将示例编译在示例目录中 在这种情况下 example file path工作正常 但我不知道如何让 roxygen 不
  • awk 用于日期范围日期格式,如 mm/dd/yyyy hh:mm:ss

    我有这样的日志文件我正在尝试检索日期范围 07 10 2013 01 31 54 SNMP 07 10 2013 01 31 54 SNMP 07 10 2013 03 03 54 SNMP 我正在使用下面的 awk 命令 它给出了所有行
  • Apache-POI 对 Excel 中的行进行排序

    我想按字符串列之一对工作表中的行进行排序 我尝试使用 Sheet shiftRows 方法来实现这一点 但我无法做到这一点 它不会在我的方法中切换行的位置 我的代码有什么问题吗 或者也许有更好的方法按 Excel 中的任何字符串列对行进行排
  • 自动高度 div 上的 Img 高度

    https jsfiddle net ry9gyb8n https jsfiddle net ry9gyb8n 大家好 几周以来我一直在尝试解决这个问题 我有一个自动高度容器 容器中的左侧 div 是自动高度 因为它里面可以有各种不同的内容
  • 如何将数字的后3位转换为0

    如何将数字的后3位转换为0 例如 3444678 到 3444000 我可以这样做 整数 3444678 1000 1000 3444000 但除法和乘法可能代价高昂 还有其他解决办法吗 你可以尝试 n n 1000 但模运算符可能与除法一
  • NewtonSoft Json DeserializeObject 空 Guid 字段

    我正在使用 ASP NET MVC C 和 HTML CSS jQuery KnockoutJs 前端 我的 HTML 页面上有一个模式联系表单 这个想法是 如果我创建一个新的联系人 模式表单会弹出空白值 包括空白的隐藏 ID 字段 如果我
  • cakephp、jquery、.ajax()、数据类型:json

    cakephp 控制器功能是否可以在没有视图的情况下完成 我试图让我的服务器返回一个不是字符串的数据类型 而是一个数组 我的控制器功能 function test this gt layout plain task Numbers uno
  • 如何垂直对齐多个表格列

    我有多个具有以下结构的表 table tr td year td tr tr td semester td td semester td tr tr td course type td td course td td course type
  • 在运行时检查宏是否已定义

    在开发静态库的过程中 遇到了测试库函数的需要 功能检查不是问题 主要问题是测试库提供的每个宏定义 我从这样的代码开始 For non vital macro OS WORDSIZE detections if defined BXI ARC