[C艹悟道]新手进阶的途径之一:善用typedef

worwolf-avatar

worwolf

2024-11-01T12:20:51+00:00

靠C艹维生数年,接过屎山,带过新人。最近偶然接了一份看着很舒服的屎山,其中的typedef真的是让我眼前一亮,大大降低了理解成本。
从学校作业到工程代码,课本、老师、同事、上司、屎山,周遭的一切会不断提醒你变量命名的重要性。意识不到这点的人,大概率也不会在这一行干的太久。相对的,如果迈过这个坎,大概率写的代码也是至少可以接受的。如果想要更进一步,有个很相似又容易被忽略的一点,就是做好变量类型的命名,即善用typedef。
对于typedef的理解一般会经历几个阶段。一是不知道有什么用,除非从别处copy,否则一律不用;二是发现有不用不舒服的场景,比如struct写默认构造;三是继承了一份C遗产,把天书直接typedef的一刻,怎一个爽字了得,自此正视typedef;四是有了新欢auto(或者是公司的编译服务器终于更新了),于是一路auto,变量名?真不熟;五是回头看自己代码(或者遇到一个不好说话的Reviewer),默默把部分auto回退,回头看到了角落里的typedef,握手言和。
我经历的大多数同事都在阶段三,也见识过阶段四的auto侠。大部分同事和我自己使用auto都很克制;很多auto侠常用“现代语言风格”“看不出类型是你的IDE不够智能”来反驳,可是现在还在用C艹的行业无法回避的一点是,那个还在用VS2009的秃头男子,很可能是公司的大动脉。还有个隐患是不同编译环境对于auto的推导不能保证完全一致,新工作的惊喜之一就是无法预料编译器会用哪个古董版本。
我自己的经验是,只在以下两种情况使用auto。一是直接能看出来类型的,比如auto t_myClass = new myClass; 二是不必在意类型的,比如STL迭代器,毕竟谁也无法忍受那漫长的前摇;还有auto greater =[](const T &v0, const T &v1){return v0 > v1;};这样的。其他情况我都是不用auto,看现在很多新特性比如auto用在template返回类型之类的,我都已经跟不上发展了。
在克制地使用auto这一前提下,要让代码水平更进一步,typedef必然会走进视野。变量命名很难,在适当的时机给变量类型重新命名就更难了。typedef既省去了C遗产的繁文缛节,又避免了现代CPP的激进改革。善用typedef,写的是连接过去和未来的代码,平稳渡过职业生涯。
偶感而发,分享给各位。
Kensaiki-avatar

Kensaiki

喷符合程序猿的刻板印象
大兄弟,虽然我明白你在技术体系得到系统提升之后堪比修仙小说中主角顿悟一般的快感无人可分享于是打开你为数不多的社交软件并兴奋地发了这个帖子
但是你要明白泥潭作为外卖员论坛公务员论坛房东论坛pc论坛大专论坛文盲论坛唯独不是程序员论坛互联网论坛用户本质是不能理解你的兴奋更别说给你什么鼓励与讨论的
以及,你的头发还好吗?哭笑
blakey2deadly-avatar

blakey2deadly

不用using?
BeefyBob-avatar

BeefyBob

学习了 c++干哪行容易入行啊?
IHabNoName-avatar

IHabNoName

很多年前我就是用using而不是typedef了
worwolf-avatar

worwolf

+ by [户名被占用的阿裳] (undefined)

喷符合程序猿的刻板印象
大兄弟,虽然我明白你在技术体系得到系统提升之后堪比修仙小说中主角顿悟一般的快感无人可分享于是打开你为数不多的社交软件并兴奋地发了这个帖子
但是你要明白泥潭作为外卖员论坛公务员论坛房东论坛pc论坛大专论坛文盲论坛唯独不是程序员论坛互联网论坛用户本质是不能理解你的兴奋更别说给你什么鼓励与讨论的
以及,你的头发还好吗?哭笑

头发好着呢,每天18:30准点下班闪光
worwolf-avatar

worwolf

+ by [家才不是小雅] (undefined)

不用using?

待过一家公司因为手搓vector和string直接把不使用using写进编程规范的,现在个人习惯不用using
Billy.-avatar

Billy.

+ by [三人生] (undefined)

待过一家公司因为手搓vector和string直接把不使用using写进编程规范的,现在个人习惯不用using

是using xx=xxx,不是using namespace
Zyrexal-avatar

Zyrexal

有点不知所云,typedef这玩意除了写跨平台兼容代码的时候算是有点用(可能还不如用宏替换),基本没啥用。
类型已经有名字了,为什么要给他个新名字,可能以前你觉得钮祜禄氏的姑妈的邻居这个名字太长了,就先叫她小美,这倒也没啥问题。现在ai编程的时代ai可不会嫌名字长,何必多此一举反而让大家容易忽略小美是满族人的事实。
而auto更像是代词她,是我已经知道她是谁,或者她爱谁谁我不关心的时候用的。
Kensaiki-avatar

Kensaiki

+ by [三人生] (undefined)

头发好着呢,每天18:30准点下班闪光

认真看来你还是不够强大,须知顶上有毛,办事不牢
我这里有一本constexpr神功、template大法、MACRO秘卷,请仔细参详jojo立5
worwolf-avatar

worwolf

+ by [_慌得要死_] (undefined)

是using xx=xxx,不是using namespace

知道,但那家奇葩公司就是直接不让用using。
worwolf-avatar

worwolf

+ by [虎饭饭] (undefined)

有点不知所云,typedef这玩意除了写跨平台兼容代码的时候算是有点用(可能还不如用宏替换),基本没啥用。
类型已经有名字了,为什么要给他个新名字,可能以前你觉得钮祜禄氏的姑妈的邻居这个名字太长了,就先叫她小美,这倒也没啥问题。现在ai编程的时代ai可不会嫌名字长,何必多此一举反而让大家容易忽略小美是满族人的事实。
而auto更像是代词她,是我已经知道她是谁,或者她爱谁谁我不关心的时候用的。

有时候连基础类型起个别名可读性和可维护性都会舒服很多,比如typedef int xx_id这样的。
至于宏替换,这个太过霸道了,例如会突破class 或者namespace
Worm-avatar

Worm

从前我也认真学了c++prime后来误入歧途跑去fpga了,记忆还停留在vector的迭代器和lambda表达式哭笑
worwolf-avatar

worwolf

+ by [HeavyIndustry] (undefined)

很多年前我就是用using而不是typedef了

囧可能是我也到了守旧迂腐的年龄了。印象里用using代替typedef好像也没多大益处,就这么一直用typedef也就用了。
其实主要是想说不要只重视变量命名而忽视类型命名,用using和typedef不影响
blakey2deadly-avatar

blakey2deadly

+ by [三人生] (undefined)

囧可能是我也到了守旧迂腐的年龄了。印象里用using代替typedef好像也没多大益处,就这么一直用typedef也就用了。
其实主要是想说不要只重视变量命名而忽视类型命名,用using和typedef不影响

using不仅可读性更好,包括了typedef的所有用法,还能用于模板类,建议是优先使用using
Phatboyvinny-avatar

Phatboyvinny

公司编码规范禁止使用typedef,而且你不觉得起名字很麻烦嘛
2f0-avatar

2f0

cpp不用using为什么不去写纯c
Eggsploited (NAW)-avatar

Eggsploited (NAW)

using完爆typedef,语义更清晰,而且你模板里面怎么用typedef
mustachetronaut-avatar

mustachetronaut

赶紧转rust吧
Loki__-avatar

Loki__

看标题差点高血压了喷
哥们,你上家公司魔怔人上家公司的事,你把这陋习带新公司去干啥
不知道你几岁,不到30赶紧改