0

我有一组数组:msg1[] msg2[].... msgn[]我需要在while循环中使用这些值。作为msgi[]. 当我将其定义为#define MSG(a) msg##a 并将其放入循环和增量i中时,它会将其扩展为msgi?

4

5 回答 5

2

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

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

int *all_arrays[] = { array1, array2 };
于 2013-04-25T13:53:49.933 回答
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;
}
于 2013-04-25T14:14:38.503 回答
1

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

这称为预处理器代码。预处理器代码是编译器在编译之前生成的代码。在此代码中,编译器将原始代码中的宏替换为宏的内容。

您的原始代码:

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;
}

您可以改用二维数组

int msg[5][5];
于 2013-04-25T13:53:37.040 回答
0

当我将其定义为 #define MSG(a) msg​​##a 并将其放入循环并递增 i 时,它会将其扩展为 msgi?

不,它不会那样工作,因为宏在编译之前被扩展,而不是在编译之后。您将需要一种不同的方法,例如@zakinster 建议的二维数组。

于 2013-04-25T13:53:38.163 回答
0

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

void** msg;

这将允许数组具有不同的大小和类型,尽管您必须转换为数组的任何类型。

于 2013-04-25T13:53:55.647 回答