c++ - 在 C 宏中捕获名称

标签 c++ c macros

以下迭代器宏是给我的(无法更改)

#define ITERATE(MACRO) \
    MACRO(v1) \
    MACRO(v2) \
    MACRO(v3) \
    MACRO(v4)

这背后的想法是,我现在可以定义自己的单参数宏并将其传递到迭代器中以扩展 v1v2v3 v4。例如:

#define MYSTUFF(X) doSth(X);
ITERATE(MYSTUFF)

将扩展为

doSth(v1); doSth(v2); doSth(v3); doSth(v4);

我当前的问题是,我想在另一个宏中调用ITERATE,该宏希望将一个额外的参数传递给MYSTUFF,超出ITERATE<提供的参数.

为了实现这一目标,我希望能够使用以下构造捕获额外的参数名称:

#define PARTIAL(T) FULL(UUU,T)
#define FULL(U,V) doSth(U,V)
#define START(UUU) ITERATE(PARTIAL)
START(bla)

我希望当ITERATE(PARTIAL)扩展为:

FULL(UUU,v1) FULL(UUU,v2) FULL(UUU,v3) FULL(UUU,v4)

我实际上会捕获STARTUUU参数,并将其替换为bla。不幸的是,情况并非如此(至少在海湾合作委员会中)。

  • 您知道这种名称捕获是否可以通过不同的方式实现吗?
  • 或者也许您对如何解决向 MACRO 传递额外参数的问题有不同的想法?
  • 我可以被允许更改 ITERATOR 定义本身,但前提是它不会破坏任何已使用它的现有代码。

最佳答案

你不能这样做。您的 START() 宏基本上采用一个参数,然后将其丢弃。

您可以做的是在需要的地方定义UUU,例如。

#define PARTIAL(T) FULL(UUU,T)
#define FULL(U,V) doSth(U,V)
#define START() ITERATE(PARTIAL)

// ...

#define UUU blah

START()

#undef UUU

关于c++ - 在 C 宏中捕获名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15415166/

相关文章:

c++ - 函数末尾的断点

replace - Notepad++,在突出显示的文本周围添加括号的快捷方式

c 函数如何接收可变长度参数?

c - 我什么时候应该提供 #defined 宏来在 Linux 内核中声明或初始化变量?

c++ - C/C++中的NaN比较规则

c++ - Microsoft Visual C++ 控制台窗口消失

c++ - 将有根层次结构的对象存储在 vector 中

c++ - 如何以这种方式从另一个文件访问方法/函数?

c - 枚举数据类型内存分配

工作维度 = 2 的 clEnqueueNDRangeKernel