首页 > 解决方案 > 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'

标签: cmacros

解决方案


如何制作一个 C 宏,该宏接受一个由空格分隔的单词列表并将它们拆分?

您不能,至少不能以任何一般方式仅使用标准 C 定义的预处理工具。如您所描述的,类似函数的预处理器宏的各个参数可以是多个(预处理)标记的序列,但是宏只能用他们的论点:

  • 将它们完全插入到其他标记序列中(包括通过将它们作为参数间接传递给其他宏)
  • 将它们转换为字符串
  • 将第一个和/或最后一个与其他标记连接起来

结合宏扩展的自动重新扫描,您可以使用最后一个做一些有趣的事情,但它们并不能以任何一般方式将您带到您想去的地方。


推荐阅读