学C++越学越有味是怎么回事

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 和宏卫生是两回事。后者是变量起名的问题。

自己给的链接内容都没看懂可还行

1 个赞

虽然不只是直接相关,但是想避免副作用,不是要提前赋值一次嘛,新变量的命名要注意卫生,就这个意思。。。

我记得最早是在 Practical Common Lisp 里看到的,里面就提到了定义宏的几个常见 leak:

1 个赞

人家说的是泛型编程,你说的是字符串替换。

完全不在一个频道。

用自己的经验质疑别人的经验,证据不足啊!

要讨论,不要抬杠.

2 个赞

讨论应该建立在基本的共识之上,并对对方的论点有一定的认识,了解论点的不足。

你对泛型编程了解多少呢?为什么要用泛型呢?

@finalpatch 的原话只是说std:sort 好于 qsort,后面的C比C++差是你脑补出来的,建议不要搞稻草人攻击。

1 个赞

由于C的拥趸们的破防,本贴的走向似乎越来越滑稽了。

A: c++的模板好于c的宏

B: c++也有宏!

这是在干什么?是在尝试反驳吗?

1 个赞