教育培训 > 为什么大部分编程语言弃用了宏?

为什么大部分编程语言弃用了宏?

2020-08-15 06:36阅读(70)

为什么大部分编程语言弃用了宏?:这个世界上绝大部分编程教材是针对刚入门的程序员写的,没错,很多编程二十年的程序员其实也刚入门。以前带队时我总是提醒新招

1

这个世界上绝大部分编程教材是针对刚入门的程序员写的,没错,很多编程二十年的程序员其实也刚入门。

以前带队时我总是提醒新招的C/C++程序员尽最大可能不要使用macro,我会警告他们macro有一千种可能令他们的代码出错并且查不出来,之所以有一千种是因为我不想再数下去了。然后他们打开我的代码以后就抓狂了。

如果你问一个程序员什么样的代码bug最多,会有很多回答,比如coding style,复杂度,blablabla…

都对,因为他们都是初级程序员。

但是,对于一个资深高级程序员,一个架构师,一个真正的高手来说,其实真正的杀手是代码长度。越短bug越少,不管它多复杂,越长bug越多,不管它多简单。

human error,that simple!

除了极极极少处不得不使用macro的场景,我使用macro都是为了缩短代码。

可读性?这个真的非常非常非常重要!是的,对于高手来说,“短”就意味着可读性不会太糟,逻辑复杂性并不是问题。如果你读不懂一段“短而tricky的”代码,说明你不是高手。

当然,你可以质疑哪里有那么多高手?没错,但我为什么要让那些低手看明白我的代码?让他们自以为看明白以后去糟蹋吗?

如果是一个真正的高手接手了我的代码,并把我狗血淋头的大骂一顿,没问题啊,他批评的一切我都认同,我诚恳认错,反正你已经看懂了。

但我还是会反复警告新手,尽一切可能避免macro!如果听者是个高手,他本来就不必理会我的blablabla。

以前我带的组里有一个高手,代码能力比我高多了,好多macro的技巧我还是跟他学的,但他极少用,我完全赞成他的理念。

如果说最坏的编程习惯,其实是copy paste,可惜这才是大多数程序员最常见的毛病(尽管几乎人人都清楚)。我在这一点上非常极端,一行C/P都不可以,我见过太多太多摔在这里的案例,每一行C/P(或相似体)我都会坚决去掉,能抽象成函数的,做成函数,出于性能考虑的,用inline,去相似性,能用template也行,如果上下文太多没法函数化,最后一个选择就是macro。

macro是一匹桀骜不驯的烈(劣)马,但是对一个好骑手来说,只需要驯服一次。

2

對宏功能的批評,請參閱C++之父的言論——沒想到吧?

3

现代编程语言一般都支持编译期常量,常量可以在大部分情况下代替宏,因此没有多引入宏这个特性。


C语言和C++为什么要支持宏呢?当年编译器技术还不够成熟,所以C语言代码文件需要分成头文件和源文件两大类,在编译的时候还有额外一个阶段叫做预处理阶段,宏就是在这个阶段被替换成实际的值的。


现代编程语言不再需要区分头文件和源文件,也没有预处理阶段,那么为了使用宏而多加一个编译阶段属于弃本逐末,所以现在的编程语言也就干脆不用宏了。


当然可能有朋友会说,宏这个东西可远远不止定义常量这么简单。我也承认宏也可以展开成非常复杂的东西,但是这时候宏就是一个非常危险复杂的特性了,我认为编程语言搞这种东西实在是没什么意思。与其关注于宏,不如为语言添加一些语法糖什么的更好。



4

宏这种东西,在C语言上一经问世、就走向让人看不懂的宏才牛逼的炫技道路,首先你必须明白:宏不是函数,不占内存,不参与编译,视图用宏代替函数的做法本身就是有危险的做法。

在面向对象的编程中,万一有人视图用宏编写一个类成员函数呢?而且要在内存中实例化,……,所以JAVA说:宏你去死吧!

5

很多语言和很多公司排斥宏并不是技术原因,而且是向现实的妥协!

因为现实的情况是【行业中有太多没有技能,没有责任心的程序员】!

宏是一个好工具,但它不是平庸的程序员能驾驭的。。。但是,唉,我也实在有点感到悲哀,这么多小朋友居然连宏都hold不住该怎么写程序?!

6

一个宏套宏,把人可以搞晕。

宏其实就是一种文本替换,纯C用它实现类似函数和模板的功能。

C++的模板也有点类似文本替换。

这两种东西可读性都不咋的。

7

不安全。

宏的作用就是替换,或者说助记,一般会给一些常用的方法定义成宏,使用的时候直接用语言写出来就好了。宏的实现也非常简单,文本替换而已。

但是缺点很明显,宏是不安全的,没有任何的检查,即使出现问题也不会第一时间知道,定位错误也会有困难,特别是引入复杂的宏函数以后。

现在很多高级语言变成了解释型语言,甚至使用动态数据类型,那么对于宏来说,失去了类型检查,其危险性就更高了。

8

工具就是工具,能不能用好取决于人。

Linux内部就有大量的宏,却不会有违和感。

9

并没有弃用宏,但使用宏定义必须规范,保证可读性。换言之,如果程序可读性差,毛病不在宏上,而是编程的人

10

有的场合必须用宏,确实很牛。

如果不是必须,就不要用了,用错了代价太大。

相关问答推荐