编辑代码

#include <stdio.h>



#define ADD(x,y) ((x)+(y))
#define ADD2(Z) Z
#define PANEL_NUMERIC_I_1 1
#define PANEL_NUMERIC_I_2 2
#define PANEL_NUMERIC_I_3 3
#define CONCAT(A,B) A##B##_##B
#define CTRLNAME(M) PANEL_NUMERIC_I_ ## M
#define TOCHAR(C) #C
#define ADD3(K) TOCHAR(K)
#define ADD4(X,Y,Z) sprintf((Z),"%s%d",(X),(Y))
#define ADD5(P) CTRLNAME(P)
#define PARA 1

int main () {
    //JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。 
    char i = 1;
    //int ADD2(n) = para;
    
    char str[25] = "0";
    char s1[] = "PANEL_NUMERIC_I_";

    for(int j = 0; j < 3; j++)
    {
        //sprintf(str,"%s%d",s1,j);
        //printf("%s\n",str);
        ADD4(s1,j,str);
        // printf("%s\n",str);
        char str1[2];
        str1[0] = j + 1;
        #define SHUZI *str1
        //printf("%d\n",*str1);
        //printf("%d\n",ADD2(*str1));                 //正确,相当于直接printf *str1
        //printf("%d\n",ADD2(SHUZI));                 //正确,相当于直接printf SHUZI声明的*str1
        //printf("%d\n",ADD3(SHUZI));                 //错误,相当于直接printf SHUZI,SHUZI变为字符串不是变量名
        //printf("%d\n",SHUZI);                       //正确,相当于直接printf *str1
        //printf("%d\n",ADD3(*str1));                 //错误,*str1变为字符串了,不再是变量名

        //printf("%d\n",ADD3(ADD2(SHUZI)));           //正确
        //char ADD2(n) = 2;
        //printf("%d\n",ADD(j,1));                    //正确
        //printf("%d\n",ADD2(n));                     //正确,输出赋的值,即2
        //printf("%d\n",ADD2(j));                     //正确,输出j代表的数字,相当于直接printf j
        //printf("%d\n",ADD(ADD2(n),1));              //正确
        //printf("%d\n",ADD(ADD2(j),1));              //正确,只是显示j+1而已,和直接printf j+1 没区别
        //printf("%d\n",CTRLNAME(ADD(ADD2(n),1)));    //错误
        //printf("%d\n",CTRLNAME(ADD(ADD2(j),1)));    //错误
        //printf("%d\n",CTRLNAME(ADD(1,1)));          //错误
        //printf("%d\n",CTRLNAME(ADD2(n)));           //错误
        //printf("%d\n",CTRLNAME(ADD2(j)));           //错误
        //printf("%d\n",CTRLNAME(ADD2(1)));           //错误
        //printf("%d\n",CTRLNAME(1));                 //正确,和1拼接在一起,形成参数名,前提是参数名存在,前面声明过
        //printf("%d\n",CTRLNAME(j));                 //错误,没有声明或定义过的参数名,可以同时定义就正确了
        //printf("%s\n",ADD3(ADD2(j)));               //正确,显示j,而不是j的值
        //printf("%d\n",ADD5(ADD2(1)));               //正确,拼接ADD2里面的内容
        printf("%d\n",CONCAT(PANEL_NUMERIC_I_,j));    //错误

    }
    
    return 0;
}