c - C宏将单个令牌分成两个
问题描述
如何制作一个 C 宏,该宏接受一个由空格分隔的单词列表并将它们拆分?
我想要一个宏,例如下面的 DECLARE()。
#define EXPAND(xy) /* expand sequence of words separated by space into 2 */
#define DECLARE(xy) DECLARE_2(EXPAND(xy)) /* x and y are separated by a space, each should go to each argument of DECLARE_2 */
#define DECLARE_2(const, type) char *type##_str = #type; const type
这样我就可以做到:
typedef struct MyStruct { int value; } MyStruct;
DECLARE(const MyStruct) x = { 2 };
print(MyStruct_str); // prints 'MyStruct'
解决方案
如何制作一个 C 宏,该宏接受一个由空格分隔的单词列表并将它们拆分?
您不能,至少不能以任何一般方式仅使用标准 C 定义的预处理工具。如您所描述的,类似函数的预处理器宏的各个参数可以是多个(预处理)标记的序列,但是宏只能用他们的论点:
- 将它们完全插入到其他标记序列中(包括通过将它们作为参数间接传递给其他宏)
- 将它们转换为字符串
- 将第一个和/或最后一个与其他标记连接起来
结合宏扩展的自动重新扫描,您可以使用最后一个做一些有趣的事情,但它们并不能以任何一般方式将您带到您想去的地方。
推荐阅读
- c# - 我正在尝试将记录插入到对象列表中,但是当我调用该方法时没有插入任何内容。我究竟做错了什么?
- python - 如何在熊猫列表中打印值==字符串的行
- pandas - 使用时间序列列名操作列时出现熊猫键错误
- c++ - 如何在 C++ 中获取要更新的值
- pandas - 寻找一种使用应用函数将列添加到数据框的有效方法
- orbeon - 如何在 Orbeon 表单 CE 中为时间输入字段创建下拉列表
- r - 跨两个向量查找不匹配位置,包括 NA
- angular - 如何将 FormGroups 和 FormArrays 传递到深度嵌套组件的递归机制中?
- python - 如何检查列表中的所有项目是否属于同一类型?
- php - 在 Web 中使用 PHP 显示 SQL SERVER 的结果?