过载 C/C++关于其参数结构的预处理器宏

发布于 2024-10-19 17:43:51 字数 345 浏览 3 评论 0原文

我想编写一个预处理器宏,如果它的参数是带括号的标记元组,则执行一件事,如下所示:

MY_MACRO((x, y))

如果它只是单个标记,则执行其他操作,如下所示:

MY_MACRO(x)

这可能吗?

如何区分空格分隔的标记数量,即 MY_MACRO(x)MY_MACRO(xy)

请注意,我并没有尝试根据参数的数量进行重载 - 在所有情况下它都是一元宏。

编辑:如果有帮助,我愿意使用可变参数宏

I would like to write a preprocessor macro that does one thing if it's argument is a parenthesized tuple of tokens, like this:

MY_MACRO((x, y))

and something else if it's just a single token, like this:

MY_MACRO(x)

Is that possible?

How about distinguishing between the number of space-separated tokens, i.e. between MY_MACRO(x) and MY_MACRO(x y)?

Note that I am not trying to overload based on the number of arguments - it's a unary macro in all cases.

EDIT: I am willing to use variadic macros if they help

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

川水往事 2024-10-26 17:43:51

至于你的第一个问题,以下宏可能会满足你的目的:

#define CONCAT_( x, y ) x ## y
#define CONCAT( x, y ) CONCAT_( x, y )
#define IS_SINGLE_1(...) 0
#define IGNORE(...)
#define IS_SINGLE_2_0           0 IGNORE(
#define IS_SINGLE_2_IS_SINGLE_1 1 IGNORE(
#define IS_SINGLE( x ) CONCAT( IS_SINGLE_2_, IS_SINGLE_1 x ) )
IS_SINGLE((x, y)) // 0
IS_SINGLE(x)      // 1

如果参数是单个标记,则宏 IS_SINGLE 将扩展为 1,
否则,0。

希望这有帮助

As for your first question, the following macros might meet your purpose:

#define CONCAT_( x, y ) x ## y
#define CONCAT( x, y ) CONCAT_( x, y )
#define IS_SINGLE_1(...) 0
#define IGNORE(...)
#define IS_SINGLE_2_0           0 IGNORE(
#define IS_SINGLE_2_IS_SINGLE_1 1 IGNORE(
#define IS_SINGLE( x ) CONCAT( IS_SINGLE_2_, IS_SINGLE_1 x ) )
IS_SINGLE((x, y)) // 0
IS_SINGLE(x)      // 1

Macro IS_SINGLE is expanded to 1 if the argument is single token,
otherwise, 0.

Hope this helps

つ可否回来 2024-10-26 17:43:51

使用 boost.preprocessor

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/seq/for_each.hpp>

#define SEQ (w)(x)(y)(z)

#define MACRO(r, data, elem) BOOST_PP_CAT(elem, data)

BOOST_PP_SEQ_FOR_EACH(MACRO, _, SEQ) // expands to w_ x_ y_ z_

它并不完全相同,因为即使单个参数情况也需要括号。但它确实允许可变数量的括号参数。

还有一种可能性:使用 BOOST_PP_IF、BOOST_PP_EQUAL 和 BOOST_PP_TUPLE_ELEM 执行类似以下操作

MACRO(1, a)
MACRO(2, (a,b) )
MACRO(3, (a,b,c) )

Using boost.preprocessor

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/seq/for_each.hpp>

#define SEQ (w)(x)(y)(z)

#define MACRO(r, data, elem) BOOST_PP_CAT(elem, data)

BOOST_PP_SEQ_FOR_EACH(MACRO, _, SEQ) // expands to w_ x_ y_ z_

It's not exactly the same as even a single argument case requires parenthesis. But It does allow a variable number of parenthesized arguments.

Also a possibility: Use the BOOST_PP_IF, BOOST_PP_EQUAL, and BOOST_PP_TUPLE_ELEM to do something like:

MACRO(1, a)
MACRO(2, (a,b) )
MACRO(3, (a,b,c) )

or so.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文