gpt4 book ai didi

宏可以替换出现在其参数列表中的标记吗?

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:48 24 4
gpt4 key购买 nike

我试图在其自身中插入一系列字节的大小。如果我想将大小作为前缀,那么这行得通:

#define COUNT(...) sizeof((uint8_t[]){__VA_ARGS__})
#define PREPEND_COUNT(...) COUNT(__VA_ARGS__), __VA_ARGS__
uint8_t x[] = {PREPEND_COUNT(10, 20, 30, 40)};
// x = {4, 10, 20, 30, 40}

但是,我也希望能够在扩展的其他地方插入尺寸。读书this page提供了一系列可能使它成为可能的工具。

是否可以按照以下方式创建内容?

uint8_t x[] = {ADD_COUNT(10, 20, THE_COUNT, 30, 40)};
// x = {10, 20, 4, 30, 40}

这是我幼稚且不成功的方法:

#define ADD_COUNT2(THE_COUNT, ...) __VA_ARGS__
#define ADD_COUNT(...) ADD_COUNT2(COUNT(__VA_ARGS__), OBSTRUCT(__VA_ARGS__)))

最佳答案

此方法使用升压预处理器。您的规范中有些歧义;为简单起见,我假设 THE_COUNT 应该简单地替换为列表的大小减一。

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/arithmetic/dec.hpp>
#include <boost/preprocessor/repetition/enum.hpp>
#include <boost/preprocessor/tuple/eat.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/size.hpp>

#define SECOND(...) SECOND_I(__VA_ARGS__,,)
#define SECOND_I(F,S,...) S

#define THE_COUNT_MATCHES_THE_COUNT ,PRED_OF_COUNT
#define PRED_OF_COUNT(...) BOOST_PP_DEC(BOOST_PP_TUPLE_SIZE((__VA_ARGS__)))

#define ELEM_OR_COUNT(z,n,data) \
SECOND(BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(n,data),_MATCHES_THE_COUNT), \
BOOST_PP_TUPLE_ELEM(n,data) BOOST_PP_TUPLE_EAT())data

#define ADD_COUNT(...) BOOST_PP_ENUM(BOOST_PP_TUPLE_SIZE((__VA_ARGS__)),ELEM_OR_COUNT,(__VA_ARGS__))

这需要一些解释。

SECOND 宏使用的技术类似于您网站的 CHECK 宏在 Detection 部分中的技术。我用它来提供可以覆盖的默认值;为此,我构建了一个“匹配器”标记作为第一个参数。对于我想要以不同方式扩展的内容,我定义了一个匹配的宏(类似于该部分中的 PROBE),它通过包含一个逗号来注入(inject)第二个参数。

在这种情况下,我希望 THE_COUNT 扩展为 PRED_OF_COUNT,因此我构建了一个匹配器 token THE_COUNT_MATCHES_THE_COUNT(我打算从THE_COUNT_MATCHES_ 加上每个参数)来做到这一点。数据在参数之后,所以 PRED_OF_COUNT 有正确的计数。对于 default 情况(一个数字),我只是输入了那个数字;因为我之后要推送数据,但不想看到它,所以我添加了一个吃宏(这有点奇怪;BOOST_PP_TUPLE_EAT() 扩展为一个元组的宏;它是不是那个宏本身)。

ELEM_OR_COUNTBOOST_PP_ENUMbody 宏 ;请参阅该文档。

ADD_COUNT 驱动机制。

最后,here's your coliru.stacked-crooked.com demo .

关于宏可以替换出现在其参数列表中的标记吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47545094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com