2

我有

#define NAME(value) my ## value ## value

当我这样做时NAME(1),它是my1value,这很好!

但我想将变量传递给NAME(),例如

for(int i=0;i<10;i++)
{
    NAME(i);
    ...
}

但不幸的是,它变成了myivalue,但我想要my0valuemy1value等等。

我应该改变什么?谢谢

4

3 回答 3

6

宏在编译时被替换(实际上,它们甚至在“真正的”编译开始之前就被预处理器替换),它是纯文本处理。

你不能指望你的宏根据变量的值来计算它的展开。

于 2013-03-14T18:48:35.860 回答
1

宏只在编译前进行文本替换。这与对代码执行“查找和替换”基本相同。循环在运行时执行——所以这没有任何意义。

但是无论如何要回答您的问题....您可以使用(编译时)宏“循环”:

#include <iostream>

#define NAME(v) my##v##value
#define LOOP10 NAME(0), NAME(1), NAME(2), NAME(3), NAME(4), NAME(5), NAME(6), NAME(7), NAME(8), NAME(9)


int main()
{
    int LOOP10;    // example usage
}

据我所知,boost 支持预处理器循环。

于 2013-03-14T19:32:48.670 回答
0

##是预处理器指令

##将##之前的 内容与 #define 语句中的内容连接起来

正如你所说的“#define NAME(value) my ## value ## value”这变成了一个错误。它的意思是“myii”而不是 myivalue

于 2013-03-14T19:15:11.407 回答