再一次感觉到 C++的恶心

19 天前
 moudy

static EntryType Graph::getEntryPoint() { return "_start"; }

void MyClass::init(Graph &g) { const EntryType entry = Graph::getEntryPoint(); }

这么简单的一段程序,调试时看 entry 的值,里面存的东西跟"_start"半毛钱关系都没有。 因为"_start"传出去时隐式 cast 成 EntryType ,然后 EntryType 实现的转换操作里做了一堆骚操作。

4888 次点击
所在节点    C++
40 条回复
thiiadoewjwe
18 天前
C++确实太恶心了,以及各种库的适配,版本问题,动态库链接的问题...让人头大
moudy
18 天前
@carlself 看到一小时二十分钟时我吐槽的玩意终于出现了

class Animal {

public: Animal(int animalAge) : age(animalAge) {}

private: int age;

};

Animal cat = Animal(5); // Clear intention to create an Animal.

Animal cat = 5; // Implicitly converts 5 to Animal(5).

This is the source of many bugs where programmers mistakenly pass one type around
levelworm
18 天前
@Tomfe #18
大佬,我不是做硬件的,就是业余爱好写点底层的代码。
qiany
18 天前
Javaer 吓哭了
red13
18 天前
@daokedao 从 c 转 rust ,前期学习成本高,后期感觉良好
ihciah
18 天前
标准委员会不是第一次犯蠢了。这帮人喜欢搞些奇怪的概念不说,还总是把名字起的贼奇怪。它不光没有防呆设计,它甚至是故意挖坑。正儿八经的 comptime feature 不搞,非要 template 歪门邪道搞元编程,绕口到给人都整出优越感了。
shilyx
18 天前
委员会对语言的态度,其实该学学 Go 。这里我不评价 Go 语言本身好坏,只说人家管理者的态度。

比如左大括号到底能不能换行、变量声明了能不能不使用,这些在很多语言里都能吵出宗教战争。但 Go 不跟你废话,直接写进规范:要么照做,要么不让编译。你可以骂它固执,但至少世界清净。

反观 C++,则是自由度开到最大。自由不是问题,问题是历史包袱太厚,几十年各种委员会争论不完。你想用个库,作者可能用了 TMP 炼丹、Concept 魔法、SFINAE 黑科技,再加上一堆“C++ 标准只在脚注里提到过一次”的奇技淫巧——结果就是:你为了要一口巧克力,不得不顺便吞一整袋巧克力味的屎。

再举个证据:

想看 Go 的官方工具链?就一套,编译器、格式化、linter 、包管理,全是官方说了算。

想看 C++?光编译器就有 GCC 、Clang 、MSVC ,每家对标准的理解都略有不同,还都带着历史兼容的枷锁。

Go 的格式化工具 gofmt 可以让团队几十秒达成统一风格。

C++ 的格式化工具? clang-format 、astyle 、Google Style 、LLVM Style ,每个团队都能吵出三天三夜。

Go 的态度是:“不需要你思考这种低价值问题。”
C++ 的态度是:“我给你无限自由,但代价是你得承受数十年遗留设计的后果。”
XIVN1987
18 天前
这么看来,,rust 要成啊这是
qieqie
18 天前
这个还得怪 C ,隐式类型转换算是 C++继承来的默认行为。不过现在单值构造函数一般的编辑器都会提示你加 explicit 吧?
roundgis
18 天前
一定是錢沒給夠
sk217
18 天前
@shilyx

关键还是历史问题太多了,一门计算机语言死而不僵,就是这样的,希望用一门语言解决所有的场景问题,那搞出来的语言绝对就是一个大怪物

后 AI 时代,还是人理解比较容易的计算机语言就好,for if function struct generic 强类型 静态类型 差不多概念能解决大部分场景的问题就行了,技术发展大发展后,大部分程序员要变成 AI 代码审查员,易读易懂的代码就是好代码,而不是弄成一堆炫技的黑魔法,诚然有些黑魔法在一些特定领域它就是有用,但是最好不要加入这些特性,隔离出来,另外发明一门语言反而更好,多语言进行调用交互合作即可

小众的场景,像一堆需要在编译时期搞的模板元,谁爱去玩谁就去玩吧,隔离好就行,不要把这种黑魔法引入大部分开发场景就好
sk217
18 天前
@shilyx linus 对 C++ 的评价是 horrible 的语言,说实话是有道理的。一门语言引入太多的特性并不是一件好事,有需要特定场景部分,单独做成 DSL 去解决是最好的,像模板元 解决的是编译期 如何动态生成代码,那就专门弄一个 DSL 模块 嵌入 C++语言里面 去解决 C++的代码生成问题,而不是在 C++上加入更多的特性去解决这个问题
cnbatch
18 天前
恶心的是写 EntryType 的那个家伙吧,初始化乱搞

就算用纯 C 来写,我猜测写 EntryType 的那个家伙也会弄成
init("_start");
然后函数体内部继续一通乱搞

真心想搞恶心操作的话,换其他的语言一样能恶心人
iseki
18 天前
语言语言功能很明显应该由使用者保证没有反直觉的情况,保证不了你就不该去用。别人也没义务为了照顾你看不懂而被迫用某种不自然的方式写代码。
iseki
18 天前
@moudy
> 每个符号都 tm 可能是别的意思

重载就是用来改变符号含义的,保证它不违反大多数人的直觉是编程者的责任。
iseki
18 天前
这个和社会分配问题不同,
yongdaimi
18 天前
@shilyx 臣附议
Zarhani
17 天前
这个字符串返回的是指向常量区域的指针,估计是发生什么隐式转换了。
yidinghe
17 天前
Java 开发者表示看不懂:C++ 什么时候成了动态类型语言?
iceheart
10 天前
别人的代码不看。能用就用,有问题就重写。
燃眉问题上调试,单步跟。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1175298

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX