【发布时间】:2019-11-29 02:15:38
【问题描述】:
我想根据参数的数量选择两个函数之一:
-
nargs = 0----> f1 -
nargs > 0----> f2.
宏执行以下操作:获取第一个参数,然后如果没有提供参数,它将添加两个逗号“,NULL,NULL”。然后它会从返回的参数列表中选择第二个参数。
例如:
-
f("Hello, world%i%s", x , s)----> "Hello, world%i%s" ---->void -
f()---->,NULL,NULL---->NULL
所以我可以根据参数的数量获得 null 或 void。
这是宏:
#define FIRST(a, ...) a
#define COMMA_IF_PARENS(...) ,NULL,NULL
#define IS_EMPTY(...) COMMA_IF_PARENS __VA_ARGS__ ()
#define RM_FIRST(x, ...) __VA_ARGS__
#define CHOOSE(...) IS_EMPTY(FIRST(__VA_ARGS__))
#define ff_(...)() CHOOSE (__VA_ARGS__)
#define FF(...)() ff_(__VA_ARGS__) ()
#define FX(...) RM_FIRST (FF(__VA_ARGS__) ())
-
FF 宏的输出:
-
FF()---->,((void*)0),((void*)0); -
FF("Hello, world%i%s")---->COMMA_IF_PARENS "Hello, world%i%s" ();
-
-
FX 宏的输出:
-
FX()--->void -
FX("Hello, world%i%s")---->void
-
-
预期的外汇输出:
-
FX()---->NULL -
FX("Hello, world%i%s")---->void
-
问题是 CHOOSE 返回的,NULL,NULL 被当作单个参数处理!
问题:
- 为什么 C 预处理器将
,NULL,NULL视为单个参数? - 如何让 C 预处理器将来自
CHOOSE的结果视为以逗号分隔的参数列表而不是单个参数?
注意:
- 我想知道为什么 C 预处理器不能按预期工作。
【问题讨论】:
-
如果逗号作为宏扩展的结果出现,那么这可以是函数调用的参数分隔符,但不能作为另一个宏的参数分隔符,因为预处理器只运行一次。
-
我认为它会像嵌套宏一样工作!你有什么办法解决这个问题吗?
-
@Rodney 不正确;宏当然可以使用扩展逗号来分隔参数……这是一种常见的 CPP MP 技术;例如,这是一个 pattern matcher demo 利用扩展中逗号的使用。只需了解 CPP 的运作方式即可。
标签: c macros c-preprocessor c99 variadic-macros