我有一组预定义的宏(我不能更改),每个宏都将数组的索引作为输入。我想要创建另一个宏,以便能够通过将标记粘贴在一起来选择要使用的先前定义的宏。

我尝试创建一个带有2个参数的宏:x选择要使用的先前定义的宏,以及ind传递给所选宏。

下面的代码使用
https://www.onlinegdb.com/online_c_compiler
因此,在将其放入相当大的应用程序之前,我可以弄清楚基本代码。

#include <stdio.h>

//struct creation
struct mystruct {
    int x;
    int y;
};

//create array of structs
struct mystruct sArr1[2] = {{1,2},{3,4}};
struct mystruct sArr2[2] = {{5,6},{7,8}};

//define macros
#define MAC1(ind) (sArr1[ind].x)
#define MAC2(ind) (sArr2[ind].y)

// Cannot change anything above this //

//my attempt at 2 input macro
#define MYARR(x,ind) MAC ## x ## (ind)

int main() {
    printf("%d\n", MYARR(1, 0));
    return 0;
}


我希望结果打印出索引为xsArr10值。相反,我得到这个输出

main.c:在“ main”函数中:
main.c:29:22:错误:粘贴“ MAC1”和“(”没有给出有效的预处理令牌
#定义MYARR(x,ind)MAC ## x ##(ind)
^
main.c:33:19:注意:扩展宏“ MYARR”
printf(“%d \ n”,MYARR(1,0));

最佳答案

第29行应为:

#define MYARR(x,ind) MAC##x(ind)


我测试了它打印了“ 1”,这是您想要的。

关于c - 如何通过将 token 粘贴在一起来创建类似函数的宏 token ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57224636/

10-11 21:27