gpt4 book ai didi

c++ - 在C/C++预处理器中获取宏参数的不同部分

转载 作者:行者123 更新时间:2023-12-01 14:50:52 24 4
gpt4 key购买 nike

我们知道在宏中,我们可以传递任意内容,例如

#define A(x) void func(x)
#define B(x) func(x)
// to define a function
A(int x) {...}
// to call a function
B(1);

您可能会看到两个宏的参数完全不同。
我的问题是,对于第一种情况,是否有解决方案来获取宏参数的不同部分:
#define A(x) void func(x) { PART1(x) a = 1; std::cout << (a+PART2(x)); }
A(int x)
// will expand to:
// void func(int x) { int a = 1; std::cout << (a+x); }
func(1);
// outputs 2

可以实现PART1和PART2吗?

最佳答案

可以实现PART1和PART2吗?

是的。 AFAIK唯一选择并丢弃以空格分隔的参数的方法是对一个部分应用模式匹配,这应该是众所周知的,并且是一个标识符。为了适合您的示例,它的工作方式如下:

#define GLUEI(A,B) A ## B
#define GLUE(A,B) GLUEI(A,B)
#define SECONDI(_,X,...) X
#define SECOND(...) SECONDI(__VA_ARGS__)
#define PART1(A) SECOND(GLUE(EXTRACTER_,A),~)
#define PART2(A) SECOND(GLUE(SHIFTER_,A),~)
#define SHIFTER_int ,
#define EXTRACTER_int , int ,

#define A(x) void func(x) { PART1(x) a = 1; std::cout << (a+PART2(x)); }
A(int x)

一切都在SECOND的基础上进行,这为您提供了第二个参数。 EXTRACTOR_foo的工作是使foo独立成为第二个参数。 SHIFTER_foo的工作是使用foo,发出逗号,然后将其余的作为第二个参数。 SECOND选择此参数,并丢弃匹配器产生的垃圾。

关于c++ - 在C/C++预处理器中获取宏参数的不同部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32002113/

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