宏扩展和字符串化:如何使用另一个宏将宏名称(而不是其值)字符串化?

2024-01-03

不感兴趣:

#define _ACD 5, 5, 5, 30

#define DEFAULT_NETWORK_TOKEN_KEY_CLASS   _ACD 

#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS }

仅使用 DEFAULT_NETWORK_TOKEN_KEY_CLASS 宏,如何在 const unsigned char [] 中获取 _ACD 字符串化。

const uint8 startMsg[] = ?? DEFAULT_NETWORK_TOKEN_KEY_CLASS ;

将导致_ACD only.

在此处获取 _ACD 的正确宏扩展是什么? 在上下文中如何将具有数组的宏字符串化为 #define a_macro {5,7,7,97}? https://stackoverflow.com/questions/11689825/how-to-stringify-macro-having-array-as-define-a-macro-5-7-7-97


(关于在没有充分理由的情况下不得滥用 C 预处理器的标准免责声明适用于此处。)

做你想做的事当然是可能的。你需要一个STRINGIFY宏和一些宏间接。

通常,STRINGIFY定义为一级间接寻址,以允许 C 预处理器在参数进行字符串化之前扩展其参数。一种实现是:

/* The # operator converts symbol 'v' into a string */
#define STRINGIFY0(v) #v
#define STRINGIFY(v) STRINGIFY0(v)

但是,您会发现这还不够:

#define _ACD 5, 5, 5, 30
#define DEFAULT_NETWORK_TOKEN_KEY_CLASS   _ACD 
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS }

#define START_MSG STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)
const char startMsg[] = START_MSG;

Here, STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)扩展到STRINGIFY0(5,5,5,30),并且 C 预处理器抱怨你已经给出了STRINGIFY0争论太多。

解决方案是推迟扩展_ACD所以它只扩展到5,5,5,30当你想要的时候。为此,请将其定义为类似函数的宏:

#define _ACD() 5, 5, 5, 30

这边走,_ACD仅当您“调用”它时才会展开:_ACD(). DEFAULT_NETWORK_TOKEN_KEY_CLASS现在将扩展到_ACD,并且您必须通过“调用”它来进一步扩展它:DEFAULT_NETWORK_TOKEN_KEY_CLASS().

下面的代码说明了解决方案:

#include <stdio.h>

#define STRINGIFY0(v) #v
#define STRINGIFY(v) STRINGIFY0(v)

#define _ACD() 5, 5, 5, 30
#define DEFAULT_NETWORK_TOKEN_KEY_CLASS   _ACD 
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS() }

#define START_MSG STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)

const char startMsg[] = START_MSG;

int main(int argc, char** argv)
{
  printf("%s\n",startMsg);
  return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

宏扩展和字符串化:如何使用另一个宏将宏名称(而不是其值)字符串化? 的相关文章

随机推荐

  • bigquery 表上可以创建的最大分区数

    将数据从未分区表移动到分区表时出现以下错误 查询执行期间超出资源 作业完成时表 mydataset mytable 20101213 将有 2501 个分区 超出限制 2500 gt bigquery是否限制可以在表上创建的最大分区数 或者
  • 在 Windows Phone 8 中获取 UI 调度程序

    我一直在开发一个使用 Windows 运行时组件 WRC 的 Windows Phone 应用程序 由非 UI 线程访问的函数需要使用访问 Windows Phone 应用程序的回调 void WControlPointCallback O
  • Woocommerce:获取当前产品类别

    如何获取用户当前正在浏览的产品类别 我正在尝试使用get the terms post gt ID product cat 但这给了我页面上列出的每个产品的类别 我想得到当前类别用户正在浏览当前产品列表页面 这是一个内衬 wp query
  • 在 Azure 应用程序网关卸载时如何需要 SSL?

    我正在将 ASP Net 网站迁移到 Azure 托管 我正在使用具有 SSL 卸载功能的应用程序网关 因此我的个人负载平衡 Web 服务器没有安装 SSL 证书 由于 SSL 是在应用程序网关上处理的 我如何向客户端请求 SSL 并将其从
  • Docker 数据库容器正在运行。另一个带有 pid 的进程正在使用 unix 套接字文件

    我正在尝试根据此消息中提供的说明运行带有初始化数据库的 docker mysql 容器https stackoverflow com a 29150538 6086816 https stackoverflow com a 29150538
  • 追加到 Bash 中的同一行

    文件 letter csv 包含 b a c 文件numbers csv包含 32 34 25 13 我想将numbers csv 附加到letters csv 如下所示 b a c 32 34 25 13 我已经尝试过这个 sed e a
  • 暂停角度动画

    Angular 2 中可以暂停动画吗 我想在鼠标悬停在元素上时暂停动画 并在鼠标移出时从停止的位置恢复动画 我创建了一个简单的脚本来演示 https stackblitz com edit scrolling text https stac
  • PIWIK GeoIP (PECL) 给出未知位置

    我已经在我的系统上成功安装了 piwik 但 geoIP 定位不起作用 我已遵循 piwik 的指南FAQ http piwik org faq how to faq 164 通过 PECL 扩展配置 Geo IP 地理定位 但总是显示 根
  • 一个变量的多个比较运算符?

    我需要对一个变量进行多次检查 我在这里看到了一个 等于 的例子 w3学校 http www w3schools com php php operators asp 但它们是两个不同的变量 现在我有 if color blue do some
  • strcmp() 的不明确行为

    请注意 我已经检查了与该标题相关的问题 但从我的角度来看 它们与该问题无关 最初我认为program1和program2会给我相同的结果 Program 1 char a abcd char b efgh printf d strcmp a
  • 从后面的代码调用jquery

    您好 我有一个 jquery 函数 单击按钮时执行该函数 我还需要根据项目是否附加注释从后面的代码执行此函数 这是jquery Comments Slide commentsnr live click function up to pare
  • 有效地在列表中查找唯一的向量元素

    我有一个数值向量列表 我需要创建一个仅包含每个向量的一个副本的列表 没有相同函数的列表方法 因此我编写了一个函数来应用来检查每个向量 F1 lt function x to remove lt c for i in 1 length x f
  • 句柄到窗口句柄

    我尝试过使用 获取桌面枚举的所有进程 ID 方法 但这不起作用 有没有办法将句柄转换为窗口句柄 或者 有没有办法获取进程 ID 并找出该进程生成的所有子窗口 我不想使用FindWindow由于多个流程问题 你可以打电话枚举Windows h
  • Grep 匹配之前和之后的字符?

    使用这个 grep A1 B1 test pattern file 将在文件中匹配的模式之前和之后生成一行 有没有办法不显示行而是显示指定数量的字符 我的文件中的行非常大 因此我对打印整行不感兴趣 而只是观察上下文中的匹配 关于如何执行此操
  • 如何获取运行 Node.js 的服务器名称?

    我想添加一行 该行将指向不同的数据库 具体取决于我运行 node js 的服务器 localhost 与 test com 等 如何获取node js中的服务器名称 即服务器端相当于location host的是什么 var os requ
  • 为什么Thread.sleep(0)可以阻止rocketmq中的gc?

    最近我阅读了RocketMQ的源代码 但我无法理解这段代码 为什么这段代码可以阻止gc呢 https github com apache rocketmq blob master store src main java org apache
  • 是什么导致 .Attach() 在 EF4 中运行缓慢?

    我们的代码中有一个通用的更新方法 它执行以下操作 foreach var entity in entityList Context GetIDbSet
  • 未应用 Azure AD 可配置令牌生命周期

    我想更改 Azure AD 中的默认令牌生命周期如图所示 https learn microsoft com en us azure active directory active directory configurable token
  • 谷歌电子表格脚本,为一个单元格提供多个超链接选择

    我有一个谷歌电子表格 在某些单元格中 它有多个名称 字符串 我想将它们与各个超链接关联起来 例如 如果我有一个像 Charles Darwin 这样的单元格 我可以很容易地通过执行以下操作来创建该名称的超链接 Hyperlink VLOOK
  • 宏扩展和字符串化:如何使用另一个宏将宏名称(而不是其值)字符串化?

    不感兴趣 define ACD 5 5 5 30 define DEFAULT NETWORK TOKEN KEY CLASS ACD define DEFAULT NETWORK TOKEN KEY DEFAULT NETWORK TOK