令牌使用增量变量在c中粘贴

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

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

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

使用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]; 

无法完成导致宏在编译时被替换而不是运行时,因此它将被替换一次…

你可以做的是使用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; } 

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

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

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

 void** msg; 

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