令牌使用增量变量在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;
这将允许数组具有不同的大小和类型,但您必须转换为数组的任何类型。