我有一组数组:msg1[]
msg2[]
.... msgn[]
。我需要使用while
循环中的值。为msgi[]
。当我将其定义为#define MSG(a) msg##a
时
并将其放入循环并递增i
,它将其展开为msgi
?
答案 0 :(得分:2)
你不能这样做。相反,您可以创建一个新数组,其中包含指向实际数组的指针:
int array1[...];
int array2[...];
int *all_arrays[] = { array1, array2 };
答案 1 :(得分:1)
使用gcc -E myfile.c
构建您的c代码,您将看到原因
这个叫做预处理器的代码。 prprocessor代码是编译器在编译之前生成的代码。在此代码中,编译器将原始代码中的宏替换为宏的内容。
你的原始代码:
for (i=0; i<10; i++) {
for (j=0; j<10; j++)
MSG(i)[j] = 3;
}
从原始代码生成的预处理器代码(可以使用gcc -E
看到):
for (i=0; i<10; i++) {
for (j=0; j<10; j++)
msgi[j] = 3;
}
您可以使用2D数组
int msg[5][5];
答案 2 :(得分:1)
无法完成导致宏在编译时被替换而不是运行时,因此它将被替换一次......
如果有相同大小的数据,可以使用2D数组;如果有不同大小,可以使用数组数组:
//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;
}
答案 3 :(得分:0)
当我将其定义为#define MSG(a)msg ## a并将其置于循环中时 递增i,它将它扩展为msgi?
不,它不会那样工作,因为宏在编译之前扩展,而不是之后。您需要一种不同的方法,例如@zakinster建议的2D数组。
答案 4 :(得分:0)
不,不幸的是,它不会。 C不支持运行时名称查找。相反,您应该使用以下形式的二维数组:
void** msg;
这将允许数组具有不同的大小和类型,但您必须转换为数组的任何类型。