C/C++這個說法本身就有問題。

n
netghost
楼主 (未名空间)

寫C和C++的時候的思路是完全不一樣的,雖然說C++是C的超集。因爲C++造出來就是爲
了兩個原因:一個是簡化OO設計實現,一個是增加C標準庫的coverage。

第一個目的,用純C其實也不是可能,linux kernel裏面很多地方就是OO的設計思路。
但是在80年代初期,沒有什麼人能夠用C來構造這麼一套東西。C++的出現就滿足了這個需求,但是實際上不是所有需要編程的地方用OO來model都是合理的,因爲世界上的東
西本來繼承就只是一種關係。在GUI和處理某些數據的地方,這個模型是合理的,事實
上的確C++在複雜GUI的場景下至今仍是佔據統治地位的語言。但是在處理網絡通信,這一類事情上面,OO就很牽強。

第二個目的,其實更重要。C的標準庫,其實大部分人要用好非常困難。實際上90年代
之前很多人用C++的目的就是有個直接無腦能用的string library。linux/bsd上面因爲C library一直都比較強大,所以C++一直到2000年都不太流行。

問題是C這個語言,和UNIX一樣,思路都是儘量不要去爲了某種特殊用例去動核心的原
則,更不會爲了少打幾個字去動核心原則。如果有需求,通過庫來進行擴展。這個做法,給C帶來了非常穩定的語言生態,和非常好的庫兼容性。當然代價就是如果不願意自
己去打造一個開發環境和積累工具的人,寫很簡單的程序也要做不少的事情。我這裏無意去評判這兩種流派的優劣,但是願意這樣的人和不願意這樣的人,本質上是兩種人。這兩種人可以爲了某個具體的事情上面去妥協而用另外一種工具,甚至段時間轉換自己的思維方式,但是卻無法改變這個本質區別。這也說明了,爲什麼C++社區會如此地喜
歡加各種新特性,因爲喜歡C++的人,就是這樣的人 - 爲了某個用例,或者方便可以改變設計的原則,而爲什麼C語言隨便加個特性都要死人。

T
TeacherWei

这两种我都喜欢。在MCU上用纯C,其它用C++。

其实对立统一也可以说C和C++是一码事。做C++的也不傻,虽然说是C的超集,但是重新造轮子这种傻事人家是不会去做的。

最简单的例子,printf系的字符串生成标准,C已经优化到了牙齿。远远不是cout能比
的。不用才傻。类似这种东西C++碰都不去碰。

你从另外一个角度去看,C++是C的补充也未尝不可!至少做了20多年,容器类现在都成熟了。把vector当成动态数组多好?除了expand要fill以外,性能没啥损失,已经优化到牙齿了。而且编译器自动优化,比如赋值自动优化成std::move之类。着远非手动代
码可比的。

另外,这两种是一码事,你可以看成只有编译器生成的symbol不一样,cpp的symbol花
样多,要extern "C"才能强制成C的symbol。其实不担C++可以随意调用C,C也能调用C++。源代码混合,library混合,都是自然的。

C++大而全,是好事。否则一个thread就有上百种写法,才是扯淡!

g
guvest

你们都没讲到cpp的模板。c必须自己写很复杂的macro,才可以functional
programming。
【 在 TeacherWei (TW) 的大作中提到: 】
: 这两种我都喜欢。在MCU上用纯C,其它用C++。
: 其实对立统一也可以说C和C++是一码事。做C++的也不傻,虽然说是C的超集,但是重新
: 造轮子这种傻事人家是不会去做的。
: 最简单的例子,printf系的字符串生成标准,C已经优化到了牙齿。远远不是cout能比
: 的。不用才傻。类似这种东西C++碰都不去碰。
: 你从另外一个角度去看,C++是C的补充也未尝不可!至少做了20多年,容器类现在都成
: 熟了。把vector当成动态数组多好?除了expand要fill以外,性能没啥损失,已经优化
: 到牙齿了。而且编译器自动优化,比如赋值自动优化成std::move之类。着远非手动代
: 码可比的。
: 另外,这两种是一码事,你可以看成只有编译器生成的symbol不一样,cpp的symbol花
: ...................

T
TeacherWei

模板和macro其实互为补充。模板和macro虽然功能有重叠,但是还有功能不重叠的部分。换句话说,模板不能完全取代macro。

很多人说macro有这样那样不好。真那么不好,还发明template干啥啊?

反正我喜欢这两者一起用。很多时候相当于自制一种语言。

这又回到了netghost说的C++可读性不好的问题了。其实C的可读性也好不到哪里去!问题是你为啥要去读它?Linux和BSD里面一大堆macro容器应有尽有,从single/double
linked list到balanced tree (heap),我都有的用。遵守规矩写代码就好了,就那么
几行。难道你非要去读那上千行代码?你要不要去认识写代码的人啊?

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: 你们都没讲到cpp的模板。c必须自己写很复杂的macro,才可以functional
: programming。

T
TeacherWei

其实连容器类都是相互补充。C那种double linked list,C++是无论如何也学不来的。语法没法满足,效率也不行。
n
netghost

我其實這裏面有個點沒說,用C的一個好處,就是扯蛋的人呢少。比如說去掉小菊花這
種人是有用的。

C++的feature從理論上來說都可以有使用場景,但是很多人喜歡濫用,比如說vector,有些人什麼東西都push,很多時候明明一個靜態數組就解決了,非要搞成複雜無比的對象容器。尤其是團隊裏面人一多,非常難控制。

更關鍵的是,這種東西讓很多白癡也可以用複雜的數據結構,對於設計是很糟糕的事情,問題是C++又沒有像別的語言一樣徹底把他們當白癡。
【 在 TeacherWei (TW) 的大作中提到: 】
: 标 题: Re: C/C++這個說法本身就有問題。
: 发信站: BBS 未名空间站 (Thu May 28 17:15:35 2020, 美东)
:
: 这两种我都喜欢。在MCU上用纯C,其它用C++。
:
: 其实对立统一也可以说C和C++是一码事。做C++的也不傻,虽然说是C的超集,但是重新
: 造轮子这种傻事人家是不会去做的。
:
: 最简单的例子,printf系的字符串生成标准,C已经优化到了牙齿。远远不是cout能比
: 的。不用才傻。类似这种东西C++碰都不去碰。
:
: 你从另外一个角度去看,C++是C的补充也未尝不可!至少做了20多年,容器类现在都成
: 熟了。把vector当成动态数组多好?除了expand要fill以外,性能没啥损失,已经优化
: 到牙齿了。而且编译器自动优化,比如赋值自动优化成std::move之类。着远非手动代
: 码可比的。
:
: 另外,这两种是一码事,你可以看成只有编译器生成的symbol不一样,cpp的symbol花
: 样多,要extern "C"才能强制成C的symbol。其实不担C++可以随意调用C,C也能调用C+
: +。源代码混合,library混合,都是自然的。
:
: C++大而全,是好事。否则一个thread就有上百种写法,才是扯淡!
:
: --
g
guvest

理论方面没啥说的。说了也不会有多少人感兴趣。

从实际应用方面来说,对我而言,所谓的functional programming,generic
programming,
用C是不实际的。因为目前我不知道怎么做,可以在实际项目中用c写好这两类风格的东西。未听闻过可靠的macro可用集合。

oo倒不是大问题,例如同是OO模块,
win32 sdk很多人认为比MFC更好。
比葫芦画瓢,需要OO的时候,能写。
【 在 TeacherWei (TW) 的大作中提到: 】
: 模板和macro其实互为补充。模板和macro虽然功能有重叠,但是还有功能不重叠的部分
: 。换句话说,模板不能完全取代macro。
: 很多人说macro有这样那样不好。真那么不好,还发明template干啥啊?
: 反正我喜欢这两者一起用。很多时候相当于自制一种语言。
: 这又回到了netghost说的C++可读性不好的问题了。其实C的可读性也好不到哪里去!问
: 题是你为啥要去读它?Linux和BSD里面一大堆macro容器应有尽有,从single/double
: linked list到balanced tree (heap),我都有的用。遵守规矩写代码就好了,就那么
: 几行。难道你非要去读那上千行代码?你要不要去认识写代码的人啊?

n
netghost

macro在很多場景下其實就夠了,我並不喜歡在和系統級和硬件級打交道的時候用
template這種太powerful的東西,如果你的算法需要編譯時展開到non trivial的類型
,非常容易出你想不到的問題。 GUI和前端應用,我沒太多意見。
【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: 你们都没讲到cpp的模板。c必须自己写很复杂的macro,才可以functional
: programming。

n
netghost

haha ,我知道很多人用MFC的一大原因是想用它的Cstring,後來vc++支持了C++標準庫
之後用的人少些了。

gui開發最主要的是tooling,要有好的ide給你畫圖。
【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: 理论方面没啥说的。说了也不会有多少人感兴趣。
: 从实际应用方面来说,对我而言,所谓的functional programming,generic
: programming,
: 用C是不实际的。因为目前我不知道怎么做,可以在实际项目中用c写好这两类风格的东
: 西。未听闻过可靠的macro可用集合。
: oo倒不是大问题,例如同是OO模块,
: win32 sdk很多人认为比MFC更好。
: 比葫芦画瓢,需要OO的时候,能写。

g
guvest

不需要functional programming那就无所谓了。
但是generic很多人是需要的。
【 在 netghost (Up to Isomorphism) 的大作中提到: 】
: macro在很多場景下其實就夠了,我並不喜歡在和系統級和硬件級打交道的時候用
: template這種太powerful的東西,如果你的算法需要編譯時展開到non trivial的類型
: ,非常容易出你想不到的問題。 GUI和前端應用,我沒太多意見。

T
TeacherWei

template其实是syntactical替换。因此只要语法正确,编译器必须能够编译。比如能
够递归。

Macro其实是Code本身的文本替换。这种替换可以没有语法意义。缺点是单向的,比如
不能递归。

但是文本替换可以可以做一些template不能做的事情。
T
TeacherWei

MCU恰恰不需要generic。所以mcu上用template是脱了裤子放P。小菊花那样的,实际工作早就被人打出去了。LOL。

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: 不需要functional programming那就无所谓了。
: 但是generic很多人是需要的。

m
mjyu

真正正儿八经搞MCU的,应该是使用C,C++或其它高级语言/高级特性是不能用的。MCU
要求你对每个字节/IO port/寄存器都要仔细控制,高级特性主要是要掩盖这些细节,
所以不合适。

我们在MCU上,如果说一段代码不能明确知道怎么用的内存/寄存器/IO port,估计立马要睡不着觉了。

M
MaLaRabbit

macro那段说得好
这玩意知道怎么用,知道人家写的东西久经考验就可以了。按照规则写就是了。源码有兴趣就看,没兴趣或者自己水平不够就别管。吃个鸡蛋也不需要去认识老母鸡。

【 在 TeacherWei (TW) 的大作中提到: 】
: 模板和macro其实互为补充。模板和macro虽然功能有重叠,但是还有功能不重叠的部分
: 。换句话说,模板不能完全取代macro。
:
: 很多人说macro有这样那样不好。真那么不好,还发明template干啥啊?
:
: 反正我喜欢这两者一起用。很多时候相当于自制一种语言。
:
: 这又回到了netghost说的C++可读性不好的问题了。其实C的可读性也好不到哪里去!问
: 题是你为啥要去读它?Linux和BSD里面一大堆macro容器应有尽有,从single/double
: linked list到balanced tree (heap),我都有的用。遵守规矩写代码就好了,就那么
: 几行。难道你非要去读那上千行代码?你要不要去认识写代码的人啊?
:
: 【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: : 你们都没讲到cpp的模板。c必须自己写很复杂的macro,才可以functional
: : programming。
g
guvest

多數人多數情況不需要。但是cpp的template 的設計,是很前衛的。頗有值得思考的地方。

【 在 MaLaRabbit(麻辣兔子王) 的大作中提到: 】

: macro那段说得好

: 这玩意知道怎么用,知道人家写的东西久经考验就可以了。按照规则写就是了。源码有

: 兴趣就看,没兴趣或者自己水平不够就别管。吃个鸡蛋也不需要去认识老母鸡。

m
mjyu

这年头, 搞不定的东西,就说它不好。。。然后就不是自己的问题了。
不都是这样么?。
T
TeacherWei

我写了之么多,主要就是想澄清一些事实而已。
一个人的发言评论,几句话,有没有做过?一眼就能看出来了。
这个人的价值观?有多少是傻?有多少是坏?一目了然!
x
xiaoju

C/C++并列是今天的主流说法,一个人的喜好改变不了多数人看法

处理网络通信需要打包解包验证大量协议,是典型的OO,除了少数古老的领域由于历史惯性使用C,大部分是C++库。

C的唯一优点是语法简单,可以极低代价实现编译器。缺点是编译器省事了,人肉电池
就要多费点事。此事在今天毫无意义,商店里的任何PC足以跑所有现代语言。

【 在 netghost (Up to Isomorphism) 的大作中提到: 】
: 寫C和C++的時候的思路是完全不一樣的,雖然說C++是C的超集。因爲C++造出來就是爲
: 了兩個原因:一個是簡化OO設計實現,一個是增加C標準庫的coverage。
: 第一個目的,用純C其實也不是可能,linux kernel裏面很多地方就是OO的設計思路。
: 但是在80年代初期,沒有什麼人能夠用C來構造這麼一套東西。C++的出現就滿足了這個
: 需求,但是實際上不是所有需要編程的地方用OO來model都是合理的,因爲世界上的東
: 西本來繼承就只是一種關係。在GUI和處理某些數據的地方,這個模型是合理的,事實
: 上的確C++在複雜GUI的場景下至今仍是佔據統治地位的語言。但是在處理網絡通信,這
: 一類事情上面,OO就很牽強。
: 第二個目的,其實更重要。C的標準庫,其實大部分人要用好非常困難。實際上90年代
: 之前很多人用C++的目的就是有個直接無腦能用的string library。linux/bsd上面因爲
: ...................

x
xiaoju

macro不是图灵完全的,代替不了template

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: 你们都没讲到cpp的模板。c必须自己写很复杂的macro,才可以functional
: programming。

x
xiaoju

你多少年不更新知识了。。。

CString从99年开始就已经被单独提出来作为模版库了,CString和其他无数第三方
String一样,比std::string方便太多

VC自古以来一直是C++标准最前线支持者,扯什么后来VC++支持C++标准库。。。

【 在 netghost (Up to Isomorphism) 的大作中提到: 】
: haha ,我知道很多人用MFC的一大原因是想用它的Cstring,後來vc++支持了C++標準庫
: 之後用的人少些了。
: gui開發最主要的是tooling,要有好的ide給你畫圖。

x
xiaoju

普遍现象。。。很多人25岁后无法学习任何新知识了

【 在 mjyu (杀猪的) 的大作中提到: 】
: 这年头, 搞不定的东西,就说它不好。。。然后就不是自己的问题了。
: 不都是这样么?。

T
TeacherWei

华为没有招你这个蠢货去当CTO,你真是屈才了!

【 在 xiaoju (可爱的龙猫) 的大作中提到: 】
: C/C++并列是今天的主流说法,一个人的喜好改变不了多数人看法
: 处理网络通信需要打包解包验证大量协议,是典型的OO,除了少数古老的领域由于历史
: 惯性使用C,大部分是C++库。
: C的唯一优点是语法简单,可以极低代价实现编译器。缺点是编译器省事了,人肉电池
: 就要多费点事。此事在今天毫无意义,商店里的任何PC足以跑所有现代语言。

i
insect9

VC++ 支持 c++ 标准?你在搞笑吧。

到VC 6.0的时候VC++和c++基本还是两种语言,互相编译不过。到2005版才基本修过来
。。。

【 在 xiaoju 的大作中提到: 】
:
:你多少年不更新知识了。。。
:
:CString从99年开始就已经被单独提出来作为模版库了,CString和其他无数第三方
:String一样,比std::string方便太多
:
:VC自古以来一直是C++标准最前线支持者,扯什么后来VC++支持C++标准库。。。
:
:【 在 netghost (Up to Isomorphism) 的大作中提到: 】
:: haha ,我知道很多人用MFC的一大原因是想用它的Cstring,後來vc++支持了C++標準庫
:: 之後用的人少些了。
:: gui開發最主要的是tooling,要有好的ide給你畫圖。

g
guvest

他这种胡扯八道,你给他指出。他会说,你不适合在言论自由的社会生活。宪法保护我的言论自由。这是真事。
我之前讲过了,他有情绪病。你也可以认为这是神经病。

【 在 insect9(insect9) 的大作中提到: 】
<br>: VC 支持 c 标准?你在搞笑吧。
<br>: 到VC 6.0的时候VC 和c 基本还是两种语言,互相编译不过。到2005版
才基本
修过来
<br>: 。。。
<br>: :
<br>: :你多少年不更新知识了。。。
<br>: :
<br>: :CString从99年开始就已经被单独提出来作为模版库了,CString和其他
无数第
三方
<br>: :String一样,比std::string方便太多
<br>: :
<br>: :VC自古以来一直是C 标准最前线支持者,扯什么后来VC 支持C 标准
库。。。
: ...................
<br>

n
netghost

這個爛人的特點就是把每個正經回答他帖子的人最後搞成把他當一條瘋狗處理不理他。

每個人都知道VC 6.0的standard compliance是個joke,這個人居然不知道。它的電腦
知識基本上都是從廁所裏面偷聽來的?

【 在 insect9 (insect9) 的大作中提到: 】
: VC++ 支持 c++ 标准?你在搞笑吧。
: 到VC 6.0的时候VC++和c++基本还是两种语言,互相编译不过。到2005版才基本修过来
: 。。。

n
netghost

這個傻逼正在把自己成爲本版最大的笑料,我現在就看他還能扔多少垃圾出來。

這逼應該在日本也這麼操作過一番,知道別人把它當屁給放了。
【 在 TeacherWei (TW) 的大作中提到: 】
: 标 题: Re: C/C++這個說法本身就有問題。
: 发信站: BBS 未名空间站 (Sat May 30 11:44:43 2020, 美东)
:
: 华为没有招你这个蠢货去当CTO,你真是屈才了!
:
: 【 在 xiaoju (可爱的龙猫) 的大作中提到: 】
: : C/C++并列是今天的主流说法,一个人的喜好改变不了多数人看法
: : 处理网络通信需要打包解包验证大量协议,是典型的OO,除了少数古老的领域由于历史
: : 惯性使用C,大部分是C++库。
: : C的唯一优点是语法简单,可以极低代价实现编译器。缺点是编译器省事了,人肉
电池
: : 就要多费点事。此事在今天毫无意义,商店里的任何PC足以跑所有现代语言。
:
:
:
: --
a
aben

感觉小菊花和他的几个菌斑队友应该比较合适和在
中国CS学术界混,

只要紧跟党菊,大嘴一张口吐莲花,国内大部分CS的院士教授
也分不清,少数能知道丫扯淡的也架不住it满地打滚还有背党妈
撑腰。

【 在 netghost (Up to Isomorphism) 的大作中提到: 】
: 這個爛人的特點就是把每個正經回答他帖子的人最後搞成把他當一條瘋狗處理不理他。
: 每個人都知道VC 6.0的standard compliance是個joke,這個人居然不知道。它的電腦
: 知識基本上都是從廁所裏面偷聽來的?

x
xiaoju

你脑子怎么短路到华为去了?

【 在 TeacherWei (TW) 的大作中提到: 】
: 华为没有招你这个蠢货去当CTO,你真是屈才了!

x
xiaoju

用VC6编译之后的C++那是肯定过不去,VC只是支持release时的最新标准

【 在 insect9 (insect9) 的大作中提到: 】
: VC++ 支持 c++ 标准?你在搞笑吧。
: 到VC 6.0的时候VC++和c++基本还是两种语言,互相编译不过。到2005版才基本修过来
: 。。。
: :
: :你多少年不更新知识了。。。
: :
: :CString从99年开始就已经被单独提出来作为模版库了,CString和其他无数第三方
: :String一样,比std::string方便太多
: :
: :VC自古以来一直是C++标准最前线支持者,扯什么后来VC++支持C++标准库。。。
: ...................

x
xiaoju

不让你yy自己是朝鲜最高司令官,你就天天骂街么

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: 他这种胡扯八道,你给他指出。他会说,你不适合在言论自由的社会生活。宪法保护我
: 的言论自由。这是真事。
: 我之前讲过了,他有情绪病。你也可以认为这是神经病。
:
: VC 支持 c 标准?你在搞笑吧。
:
: 到VC 6.0的时候VC 和c 基本还是两种语言,互相编译不过。到2005版
: 才基本
: 修过来
:
: 。。。
:
: :
:
: :你多少年不更新知识了。。。
: ...................