BOOST_PP_SEQ_SIZE 是如何工作的?

Posted

技术标签:

【中文标题】BOOST_PP_SEQ_SIZE 是如何工作的?【英文标题】:How does BOOST_PP_SEQ_SIZE works? 【发布时间】:2021-01-15 03:01:59 【问题描述】:

根据https://www.boost.org/doc/libs/1_68_0/libs/preprocessor/doc/ref/seq_size.html

BOOST_PP_SEQ_SIZE 宏扩展为 seq 的大小。

示例代码

#include <boost/preprocessor/seq/size.hpp>

#define SEQ (a)(b)(c)

BOOST_PP_SEQ_SIZE(SEQ) // expands to 3

这太神奇了。它是如何工作的?

【问题讨论】:

【参考方案1】:

您可以在此处阅读源代码:https://www.boost.org/doc/libs/1_75_0/boost/preprocessor/seq/size.hpp

有不同编译器的版本,但差别不大。这个宏的定义如下:

# define BOOST_PP_SEQ_SIZE(seq) BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_0 seq)

# define BOOST_PP_SEQ_SIZE_0(_) BOOST_PP_SEQ_SIZE_1
# define BOOST_PP_SEQ_SIZE_1(_) BOOST_PP_SEQ_SIZE_2
# define BOOST_PP_SEQ_SIZE_2(_) BOOST_PP_SEQ_SIZE_3
# define BOOST_PP_SEQ_SIZE_3(_) BOOST_PP_SEQ_SIZE_4
# define BOOST_PP_SEQ_SIZE_4(_) BOOST_PP_SEQ_SIZE_5

... ...

# define BOOST_PP_SEQ_SIZE_256(_) BOOST_PP_SEQ_SIZE_257

# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_0 0
# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_1 1
# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_2 2

... ...

# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_257 257

这段代码:

#define SEQ (a)(b)(c)
BOOST_PP_SEQ_SIZE(SEQ)

将扩展为:

BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_0 (a)(b)(c))
-> BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_1 (b)(c))
-> BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_2 (c))
-> BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_3)
-> BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_3
-> 3

这就是它的工作原理。

需要注意的是,当序列长于预期(例如 257)时,没有为这种情况准备友好的错误消息,但是存在于 boost/preprocessorfor 部分中。

【讨论】:

以上是关于BOOST_PP_SEQ_SIZE 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何理解异常处理是如何工作的?

我是如何学习和工作的 - 番茄工作法

这段代码是如何工作的,很短的方法来反转一个字符串,它工作,但我不知道如何

DMA 是如何工作的? DMA的工作流程是啥? [关闭]

JavaScript是如何工作的: Web推送通知的机制

这个递归是如何工作的?