跃I.0
2018-07-14 14:02
采纳率: 52.2%
浏览 1.4k
已采纳

这个c语言里宏替换怎么实现啊

宏函数 参数列表是没有要求的,,,可是 传参的时候就会 很麻烦
比如 #define def(i) i=0 非要传入 def(i)这样的才可以,,可是这样参数不就固定死了,或者非要为Int 型 具体请看我代码,怎么把一个字符串变成int型呢,比如只有“ i”又想用这个宏函数怎么写

 #include <string.h>
#include <stdio.h>
#define def(i) i=0
#define set(x,y) x=y
#define print(i) printf("%d",i)
static int def(i);
int main ()
{
    char str[4][20] = {"def i\n","set i 1\n","set i i+1\n","print i\n"};
    char s[2] = " ";
    int j;
    for(j=0; j<4; j++)
    {
        split(str[j],s);
    }

}
void split(char *str ,char *s)
{

    char *token;
    int j=0;
    char *name[5];

    token = strtok(str, s);
    while( token != NULL )
    {
        // printf("%s\n", token );
        name[j]=token;
        //  printf("%s\n",name[i]);
        token = strtok(NULL, s);
        j++;
    }

    if(strcmp(name[0],"def")==0)
    {
     def(name[1]);//这里name[1]就是i 想替换成 def(i);

    }
    else if(strcmp(name[0],"set")==0)
    {
       set(name[1],name[2]);//这里name[1] name[2]也就是i\n,i+1\n想替换 set(i,i+1);
    }
    else if(strcmp(name[0],"print")==0)
    {
        print(name[1]);//这里name[1] 就是一个字符串i\n  想替换 成 print(i);
    }

}

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • threenewbee 2018-07-14 14:36
    已采纳

    你这个没法办到,因为宏的替换是在编译的阶段完成的,而name[1]是在运行的时候才被求值,才知道是“i”
    你的宏的替换根本没有机会被执行到。

    已采纳该答案
    打赏 评论
  • threenewbee 2018-07-14 14:53
     如果你想设计一个简单的脚本语言解释程序,需要和程序中的变量交互,可以这么做:
    int * vartable[26];
    vartable['i' - 'a'] = &i;
    
    这样
    *vartable[name[0]-'a'] = 123;
    就可以达到给 i 赋值的目的了。
    
    打赏 评论
  • Youlor 2018-07-14 15:38

    宏是编译期的预处理阶段编译器进行的文本替换
    可以添加编译选项 /p 查看得到的文本替换后的代码

    打赏 评论
  • weixin_38243460 2018-07-16 02:45

    宏是编译器再预处理阶段进行处理的,而宏的调用是在程序运行时候开始进行的,没办法做到

    打赏 评论
  • Uchiha-Madara 2018-07-18 07:58

    说明你还是没真正理解宏定义的本质,本质就是:在源代码编译之前把宏定义的地方进行简单的文本替换。

    打赏 评论
  • 跃I.0 2018-07-18 09:47

    我知道啦我知道啦 宏函数写的少嘛,,定义知道,做又是另一回事,,,,谁没事写宏啊

    打赏 评论

相关推荐 更多相似问题