2013-04-25 52 views
0

我有一组数组:msg1[]msg2[] .... msgn[]。我需要使用while循环中的值。作为msgi[]。当我将它定义为#define MSG(a) msg##a 并将其放在一个循环中并增量为i时,它将其展开为msgi使用变量递增的变量粘贴令牌

+3

为什么不使用二维数组? – zakinster 2013-04-25 13:52:19

+1

因为数组都是不同的大小和类型。 – umayneverknow 2013-04-25 13:53:00

+1

不同的尺寸是没有问题的,不同的类型..以及你会在那里举办派对... – 2013-04-25 14:21:35

回答

2

你不能那样做。相反,您可以创建一个新阵列,其中包含指向实际阵列的指针:

int array1[...]; 
int array2[...]; 

int *all_arrays[] = { array1, array2 }; 
+0

我确实尝试过这种方式,但仍然一直说'array1''array2' ..没有定义。我不知道为什么。 – umayneverknow 2013-04-25 14:06:27

+0

@ ad3我的例子就是这个例子。这只是表明了原则。你必须调整它来处理你的代码,你的数组和你的类型。 – 2013-04-25 14:08:19

+0

对不起!得到它了。非常感谢! – umayneverknow 2013-04-25 14:12:01

1

建立与gcc -E myfile.c C代码,你会看到的原因

这个叫预处理程序代码。预处理器代码是编译器在编译之前生成的代码。在这段代码中,编译器用宏的内容替换源代码中的宏。

您的产地代码:

for (i=0; i<10; i++) { 
    for (j=0; j<10; j++) 
     MSG(i)[j] = 3; 
} 

从产地代码生成preprocessr代码(可以用gcc -E可见):

for (i=0; i<10; i++) { 
    for (j=0; j<10; j++) 
     msgi[j] = 3; 
} 

您可以使用二维阵列代替

int msg[5][5]; 
+0

我得到了为什么我的代码不起作用。谢谢! – umayneverknow 2013-04-25 14:12:24

0

当我将其定义为#define MS G(a)msg ## a并将其放入一个循环中,然后增加i,它将其展开为msgi?

不,它不会以这种方式工作,因为宏在编译之前被展开,而不是在之后。你需要一个不同的方法,比如@zakinster建议的二维数组。

0

不,不幸的是它不会。 C不支持运行时名称查找。相反,你应该使用形式的二维数组:

void** msg; 

这将允许阵列具有不同的尺寸和类型的,虽然你将不得不转换为任何类型的数组。

1

它不能这样做的原因宏在编译时更换不是运行,所以它会更换一次......

你可以做的是使用二维数组是否有相同的大小或使用如果存在不同大小的阵列阵列:

//once in your code you need to do this: 
int array0[]; 
int array1[]; 
//... 
int arrayX[]; //X should be replaced with a real number... 
int **arrayOfArrays = new (int*)[X+1]; 
arrayOfArrays[0] = array0; 
arrayOfArrays[1] = array1; 
//... 
arrayOfArrays[X] = arrayX; 

//now you could use it like that anytime in your code: 
int i; 
for(i = 0; i < X; ++i) 
{ 
    //Do whatever you want to do, like: 
    arrayOfArrays[i][0] = 1234; 
}