C/C++语言为什么要有宏?

来源:互联网 发布:怎么做数据透视表 编辑:程序博客网 时间:2024/05/29 04:15

不知道大家有没有考虑过这样一个问题,除了C/C++语言之外,似乎很少在其他语言中看到类似宏定义的设计。
我个人的理解如下

1.运行速度问题
大家都知道,调用函数是有开销的,虽然在现代的计算机上,这种性能损耗可能微不足道,但是在C语言发明的那个年代,可能算是一笔不小的开销,特别是在循环中调用函数时。
所以大家可以看到C语言标准库定义了很多模拟函数的宏,这是一种典型的空间换时间的做法,这些宏在编译时都会被替换展开,所以最后的程序里没有调用函数的开销,只是程序会稍微大一些。

2.占用空间问题
大家可能觉得奇怪,前面不是说了空间换时间了吗,现在怎么又变成占用空间的考虑了?
其实这个是从两方面说的,条件编译可以使一些不需要的语句不被编译,例如测试时的代码可能包含assert,但是希望在最终的代码中不包括assert,就可以使用条件编译。这样做可以省一些最后程序占用的空间,以及运行时占用的内存。
但是实际上这玩意并不是必要的,很多不支持条件编译的编程语言照样活的好好的,就算多编译进去一些语句也没什么。但很多添加了条件编译的C/c++程序往往使可读性大大下降。

3.为代码添加元数据,被一些特殊的编译器处理,或者自己处理。其实很多现代编程语言中都有这个功能的影子存在,比如java的annotation注解。这些元数据不会被留存在最后的程序中,而只是供编译器/解释器 做一些预处理。
比如java的junit框架,就是根据annotation注解来工作的。
c语言的话,一些特殊的编译器可以识别一些特殊的宏,然后做一些额外的工作,例如插入检查数组下标的代码。

4.添加一些语言中不存在的结构
比如,我们可以重定义C语言的关键字 将{}改为pascal 一样的begin end组合,甚至可以写一个foreach的宏模拟函数式的编程。
不过在现在的编程语言中,控制结构已经非常丰富,现代编程语言往往是多范式的,同时支持命令式,面向对象,函数式,例如kotlin,scala,c#
所以没有什么必要用宏添加一些除了你之外没人看得懂的新结构。

主要的原因应该就是这几个了。那么为什么一些现在的语言都没有宏定义了呢?相信看过前面的一些理由后,已经可以明白了
在现代的计算机上,1,2两个理由已经不成问题,而且现在编程语言更多的关注点是写出可维护性高,可读性高的代码,并且快速开发。
而且宏这个东西,滥用往往会写出一些常人无法读懂的东西,不但不好维护,而且很可能会出现莫名其妙的bug。

原创粉丝点击