怎样在C语言中实现类似于变量定义的功能
多看书 少空想
■网友
easy啊。用C写个python解释器,然后直接输入a=10就行了,都不用写int,多痛快?
■网友
手写解释器即可,至于怎么写,可以参考轮子哥的文章。
■网友
你要的这个叫做eval,很多语言都有。这个通常是动态语言的特征,比如说JavaScript才有的。有虚拟机的静态语言也支持,比如说Java(因为可以利用虚拟机特征来支持). 你说C语言不太具体,因为不知道宿主是啥,而C语言是源代码跨平台的。如果平台支持那就是支持,否则不然。通常,c语言可以用lua脚本达到这个效果。-----------作为一个老程序员,我给很多非科班出生的程序员,尤其是没有学过编译原理的程序员来讲解一下吧。不要动不动就"不需要""做不到",对于动态静态语言合流的时代说这话,分分钟被打脸。首先,动态语言(脚本语言)是肯定支持这个的,这个叫做eval,就是说把字符串直接当程序的一部分给执行了,这没啥奇怪吧,脚本语言通常可以不编译的。就eval来说: C语言通常不属于脚本语言(动态语言),属于静态语言。然而,c语言是语言级别跨平台的,不管是哪个规范都只是规定了语言定义,并不包含执行环境;而我就写过脚本的c语言,在一个嵌入式设备上(支持eval)。按照现代的语言环境,通常认为你说c是指Gcc了(因为没啥人用Windows+c了)。那么以我不大熟悉的经验来说应该是暂时未支持的,然而gnu c++这种应该是支持的.微软的c++,有.net平台的,必然支持(考虑题主混淆了c/c++)通常认为静态语言,不支持eval,然而时代在改变,java c#这种静态语言,早就有了动态特征了。典型的特征叫做自省,现代静态编程语言不支持自省是无法想象的。java的传统的自省叫做反射,随便一个有经验的程序员都是用得烂熟了。支持自省一般是有了虚拟机在作怪,而现代编程语言带虚拟机带自动内存管理垃圾回收是标配。然而,题主的例子举得不好。声明一个变量没有任何含义,因为你这个变量没有被其他部分引用,如果碰到了激进的编译器(执行引擎)会被当成废代码给删掉的。然而,如果我们优化这个例子,认为题主是想在静态语言中获取一段eval的值。那么就简单了,c语言或者c++里面嵌入一个脚本引擎即可。Java 也有rhino beanshell 等等内置的,外挂的groovy jruby等等也很流行。其中groovy 的语法和java完全兼容,你去声明一个类,new任何东西都可以。.net就更简单了,来一段混合语言编程。如果题主是想通过一些动态的输入的字符串改变替换c程序的全局变量,也是可以的。以我对c不成熟的理解,这不是c语言的特征,需要Linux kernel api(或者其他宿主环境)支持,获取所有全局变量列表,然后轮询,找到匹配的,然后设置值即可。应该是需要宿主环境支持。别说这个了,连方法调用都可以这样动态干。(需要理解编译后的文件,和执行环境的区别。c语言的编译后的文件当然是不改了,但是所有的变量总是要要执行得时候在内存有位置的,只要是内存中的东西,还是用户环境的,总可以改的)如果是Java就简单了,如果是改变实例变量直接反射即可。类(静态)变量稍微麻烦一点,也是反射可以。如果是局部变量,有点麻烦。方法有两个,一是动态代理,虽然改不了方法自身,然而从jvm的栈的角度观察,当前帧换出,换入了你的代码,想干啥干啥。二是静态织入加上类的热替换,这个更彻底,直接运行时把你的类都换掉,方法代码更不必说了。如果你的方法本身准备了MBean这样的接口,那更简单了,随便改。至于这么做有啥意义。没有这个,高级语言就不可能具备这么高的抽象性,也就不会有那么多的的框架,写程序复制粘贴的工作就会多十倍甚至百倍。掌握这个,基本技能了,如果不想当重复的流水线工人的话。未完成。
■网友
不太严格来说你这个需求的功能是写一个解释器 如果你很想仔细研究的话需要先去学编译原理 如果你只是想输入int a=10;以后再输入a可以显示10 那你可以用链表来简单模拟这个过程
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 北京22家市属医院均开展安检基本实现重点区域安检措施全覆盖
- 长江流域渔民退捕“上岸”实现扩产新致富
- 实现“甜蜜计划”,这对中哈跨国夫妻好甜
- 北京地铁11号线西段三座车站提前实现主体结构封顶
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
