C++不这么认为,他觉得preprocessor比较有用,于是加上了类型验证等特性,template就出来了。
也许这个proprocessor只是C用得比较多罢了(在某种意义上,宏不认识C,C也不认识宏,但gcc认识他们),将 “C preprocessor” 换成 m4,不一样有宏支持(当然更强大也更难debug)吗?
C++ 如何认为是 C++ 的事。
宏的参数不检查类型,所以你可以用同一个宏给数组添加整数或者浮点数,如果改成inline函数就得把参数类别定下来,也就没法支持多种类型了。即想要inline函数,又想要支持多种类型,于是你就发明了函数模板。
你如何认为是你的事
那写程序就要负责一些,使用 `sc_array_del_unordered’ 前先看说明,确认会否重复 evaluate。
C++ 同样存在这个问题,可能用宏来实现,得看提供方具体如何做。
现代C++风格不提倡使用宏。可以写成函数的东西一定要写成宏是不会通过code review的。
这是你的个人经验,我们单位有 macro 满天飞的 C++ 代码。(大部分代码是用 C 实现的,不过调用了非常多的 C++ 库)
这个在 C 也同样适用,有副作用的一般来说都不会用宏来定义。
注意宏卫生就好了, 和 Lisp 里面的 macro 一样,提前把参数赋值好,防止副作用调用多次。
分割线
感觉这个帖子看下来在于 @finalpatch 说的太绝对了,C 的特点是简洁,尽管由于这种简洁,导致 std::sort 比 qsort 性能好,这也不能说明 C 比 C++ 差。C++ 是功能丰富,有智能指针、模板一系列高级功能,但这后果是语言的复杂度升高。
C 程序员能清楚知道自己写的 C 代码对应到指令大概是什么样子的;相反,C++ 由于有 name mangling 之类的高级特性,导致程序员无法确定代码最终的样子,这也是为什么 Linux 一直没采用 C++ 的原因之一。
PS:这两门语言都是上古遗留下来的语言了,今天写基础软件的话,我用 Rust。
emacs 不也是上古遗留下来的,照样很香
开发上的问题基本上都不是问题,其实选择用哪种语言编程是个人偏好问题,与语言本身几乎不相干
Once-only 和宏卫生是两回事。后者是变量起名的问题。
自己给的链接内容都没看懂可还行
虽然不只是直接相关,但是想避免副作用,不是要提前赋值一次嘛,新变量的命名要注意卫生,就这个意思。。。
我记得最早是在 Practical Common Lisp 里看到的,里面就提到了定义宏的几个常见 leak:
人家说的是泛型编程,你说的是字符串替换。
完全不在一个频道。
用自己的经验质疑别人的经验,证据不足啊!
要讨论,不要抬杠.
讨论应该建立在基本的共识之上,并对对方的论点有一定的认识,了解论点的不足。
你对泛型编程了解多少呢?为什么要用泛型呢?
由于C的拥趸们的破防,本贴的走向似乎越来越滑稽了。
A: c++的模板好于c的宏
B: c++也有宏!
这是在干什么?是在尝试反驳吗?