C 预处理器将“int x”拆分为 int & x

2023-11-23

我需要能够获得以下内容:

#define MY_MACRO(PARAM1,PARAM2) \
 MY_OTHER_MACRO(TYPENAME_OF(PARAM1),PARAMNAME_OF(PARAM1));\
 MY_OTHER_MACRO(TYPENAME_OF(PARAM2),PARAMNAME_OF(PARAM2));\

to cause

MY_MACRO(int x,char *z) 

编译为

MY_OTHER_MACRO(int,x);
MY_OTHER_MACRO(char*,z);

或者如果它编译为:

MY_OTHER_MACRO(int,x);
MY_OTHER_MACRO(char,*z);

或者甚至这也可以:(我可以编写 MY_OTHER_MACRO 来处理任一结果)

MY_OTHER_MACRO(int,x);
MY_OTHER_MACRO(char,z);

或者,如果有某种方法可以计算由空格分隔的标记(并假设“*”是单独的标记,我也可以使用它 - 例如 2 vs 3) 据我所知,通常标记是用逗号分隔的。有什么办法可以使用另一个角色吗?


您可以做到这一点,但只有一个极其困难的限制,即您必须提前知道所有类型名称:它不适用于任何用户定义的类型,除非用户也将它们添加到已知类型列表中 - 无可否认,不难。

接受这个限制,你可以这样做:

#define LPAREN (
#define RPAREN )
#define COMMA ,

#define CAT(L, R) CAT_(L, R)
#define CAT_(L, R) L ## R
#define EXPAND(...) __VA_ARGS__

#define SPLIT(OP, D) EXPAND(OP CAT(SPLIT_, D) RPAREN)

#define SPLIT_int LPAREN int COMMA
#define SPLIT_char LPAREN char COMMA
#define SPLIT_float LPAREN float COMMA
#define SPLIT_double LPAREN double COMMA

#define MY_MACRO(A, B) \
SPLIT(MY_OTHER_MACRO, A); SPLIT(MY_OTHER_MACRO, B);

MY_MACRO(int x, char * z)  // emits MY_OTHER_MACRO ( int , x ); MY_OTHER_MACRO ( char , * z );

如上所述,将一种类型添加到已知类型列表中是一个单行代码 (#define SPLIT_myType LPAREN myType COMMA),并且可以在程序中的任何位置完成,只要它出现在该类型实际使用之前SPLIT,所以这不是世界末日,尽管它具有很强的侵入性。

没有简单的方法可以让星号位于分割线的左侧。它可能可以完成,但会复杂得多,并且涉及对允许的变量名称列表进行限制,这在我看来要糟糕得多。可能也更具侵入性,因为几乎可以肯定,工作程序中的变量比类型还要多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 预处理器将“int x”拆分为 int & x 的相关文章

随机推荐

  • 如何将多个 .net 程序集合并为一个程序集?

    我有一个包含大约 10 个程序集的 net 应用程序 如果将它们作为一个组件组合在一起 那就太好了 我该怎么做 我猜想类似于 Java 应用程序的 jar 文件 Try ILMerge NuGet包here
  • 如何使用 Cocoa 和 Python (PyObjC) 创建状态栏项目?

    我在 XCode 中创建了一个全新的项目 并在我的 AppDelegate py 文件中包含以下内容 from Foundation import from AppKit import class MyApplicationAppDeleg
  • 使用 POST 请求 golang 上传文件

    我是 golang 新手 我正在尝试编写一个函数 为我正在编写的机器人上传带有发布请求的文件到电报 我尝试过使用这段代码 但我从电报中得到的错误是Bad Request there is no photo in the request 我在
  • OpenCV:从USB摄像头捕获的黑色图像

    我正在尝试使用 opencv 从 USB 摄像头捕获图像帧 然而我总是得到一个黑框 我已经阅读了很多有关此问题的帖子并尝试了所有建议 但对我来说没有任何作用 我开始使用这里讨论的代码 http opencv users 1802565 n2
  • 在 LinearLayout 中设置 textview 的宽度

    我正在使用列表视图的标题 ListView 标题有三列 说a b c 我使用两个 LinearLayouts 来设计 ListView 标题 如下所示
  • 新渲染元素的动画,但页面加载时不动画

    我订阅了 Firebase 实时数据库 这样当我向它提交某些内容时 它会立即在视图中呈现 而不需要 jQuery 或 ajax 我想对这些元素的渲染进行动画处理 这样当一个新元素添加到 DOM 时 它的div s background co
  • Swift 中的十六进制/二进制字符串转换

    Python 有两个非常有用的库方法 binascii a2b hex keyStr 和 binascii hexlify keyBytes 我在 Swift 中一直在努力解决它们 Swift 中有什么现成的东西吗 如果没有 又该如何实施呢
  • React类中的成员变量通过引用“共享”

    当我创建一个反应类的多个实例 通过在同一个类上使用 React createElement 时 一些成员变量在实例之间共享 数组和对象是共享的 字符串和布尔值等不是共享的 对我来说 这感觉可怕 可怕 错误 这是一个错误还是有其他方法可以做我
  • java中如何输入BigInteger类型

    当我尝试获取 Integer 类型的输入时 我只需要做下面的代码 Scanner sc new Scanner System in int N sc nextInt 但当涉及到 BigInteger 时 我不知道该怎么办 我该如何读取用户的
  • 表单不响应 KeyDown 事件

    我已经在 Windows 窗体项目上工作了一段时间 并且决定尝试使用键盘快捷键 经过一番阅读后 我认为我必须编写一个事件处理程序并将其绑定到表单的 KeyDown 事件 private void Form1 KeyDown object s
  • 在 Android 中仅运行一个自定义应用程序,阻止其他任何应用程序运行

    是否有可能让 Android 只能运行一个应用程序 看来制作定制 ROM 可能是一个选择 有人能给我指出正确的方向吗 对此已有许多答案和问题 基本上你有以下选择 创建您自己的 rom 创建您自己的启动器应用程序 最好的解决方案肯定是1 但它
  • Django Rest Framework 每个视图的自定义权限

    我想在 Django Rest Framework 中基于视图 方法 用户权限创建权限 有没有一种方法可以实现这一目标 而无需手动编写每个权限并检查用户所在组的权限 另外 我面临的另一个问题是权限对象与某个模型相关联 由于我有影响不同模型的
  • UIAppearance 删除 UIPopoverController 的自定义导航栏背景

    我正在整合 iOS 5 的 UIAppearance 功能 为我的通用应用程序提供独特的主题 目前 我已经在我的应用程序委托中实现了一些代码来为应用程序提供自定义导航栏 UIImage navBarImage UIImage imageNa
  • Git:所有分支的默认“无提交”合并行为?

    我希望 git merge 默认情况下不提交 即 我希望默认情况下 no commit 行为 无论目标分支如何 我知道特定分支的 git config Branch master mergeoptions 并且我知道默认情况下禁用所有分支上
  • 在 Django 中发送电子邮件的连接超时问题

    我读自 http www packtpub com article friends via email social web application django 1 0 并按照以下步骤操作 gt 并改变我的 设置 py SITE HOST
  • 在anaconda3中安装openCV - Python.h:没有这样的文件或目录

    我正在尝试为我的 anaconda3 安装构建 opencv 3 1 0 但我的构建失败 94 Building CXX object modules python3 CMakeFiles opencv python3 dir src2 c
  • 使用 CLI 清除客户端缓存

    我们正在使用aurelia cli 任务包括 build json build ts process css ts process markup ts process sass ts run json run ts test json te
  • Scrapy PyInstaller OSError:无法获取源代码/twisted.internet.defer._DefGen_Return

    我正在尝试使用 PyInstaller 将一个非常简单的 Scrapy 蜘蛛发布为 EXE 文件 我已经搜索并阅读了我能找到的所有内容 但我仍然无法弄清楚出了什么问题 我怎样才能解决这个问题 如果我将yield更改为return 它不会给我
  • 在 Freemarker 宏中模拟空参数

    我正在使用 Freemarker 构建一个网站 并开始大量使用宏 我知道在 Freemarker 2 3 中 将 null 值作为参数传递到宏中相当于根本不传递参数 因此我创建了一个名为 null 的全局变量来模拟宏中的 null 检查 l
  • C 预处理器将“int x”拆分为 int & x

    我需要能够获得以下内容 define MY MACRO PARAM1 PARAM2 MY OTHER MACRO TYPENAME OF PARAM1 PARAMNAME OF PARAM1 MY OTHER MACRO TYPENAME