使用递增的变量在 c 中粘贴标记

Posted

技术标签:

【中文标题】使用递增的变量在 c 中粘贴标记【英文标题】:Token pasting in c using a variable that increments 【发布时间】:2013-04-25 13:50:49 【问题描述】:

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

【问题讨论】:

为什么不用二维数组? 因为数组的大小和类型都不同。 不同的尺寸没问题,不同的类型......好吧,你会在那里举行派对...... 【参考方案1】:

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

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

int *all_arrays[] =  array1, array2 ;

【讨论】:

我确实尝试过这种方式,但它仍然一直说 array1``array2 .. 没有定义。我不知道为什么。 @ad3 我的例子就是这样,一个例子。只是说明原理。您必须调整它以使用您的代码、数组和类型。 对不起!知道了。非常感谢!【参考方案2】:

gcc -E myfile.c 构建你的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];

【讨论】:

【参考方案3】:

无法完成,因为宏在编译时而不是运行时被替换,所以它会被替换一次......

如果大小相同,您可以使用二维数组,如果大小不同,则使用数组数组:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

void** msg;

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

【讨论】:

以上是关于使用递增的变量在 c 中粘贴标记的主要内容,如果未能解决你的问题,请参考以下文章

变量在 C# Release x64 中不递增

如何使用递增变量在标签中显示 .mdb 信息

word怎么使序号递增?是文档,不是表格.我用seq \n 0试了,手动帖能递增,但是用替换就不行了.谁能解答一下

C++ 内存地址递增

递增递减运算符

为啥在 C 中前缀递增 (++x) 比后缀递增 (x++) 快? [复制]