首页 注册 登录
V2EX = way to explore V2EX 是一个关于分享和探索的地方
现在注册 已注册用户请 登录
V2EX C++

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

moudy · 2025 年 11 月 27 日 · 5367 次点击
这是一个创建于 45 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

40 条回复 2025年12月06日 05:53:49 +08:00
carlself
1
carlself 2025 年 11 月 27 日 ❤️ 3
&t=99s 看看这个视频解压一下,喷了两个小时 C++
aloxaf
2
aloxaf 2025 年 11 月 27 日
@carlself 好家伙,两个小时,这作者对 C++ 是真爱啊😆
yolee599
3
yolee599 2025 年 11 月 27 日 via Android ❤️ 2
我就是能用 C 就不用 C++
songray
4
songray 2025 年 11 月 27 日 ❤️ 1
@carlself 这个视频我完整的看完了...
最搞的是,从 GitHub 主页来看,这作者真的是 C++ 的高级开发,吐槽的也都在点子上。

看完后我的看法是,越 modern 越复杂,越 modern 越不好用,不如 C with class (
vfs
5
vfs 2025 年 11 月 27 日 ❤️ 1
"然后 EntryType 实现的转换操作里做了一堆骚操作": 所以还是实现 EntryType 的人的问题么。 你 hold 不住就不要用这么高级的特性么,当作 c with class 来写不就可以了么
xdeng
6
xdeng 2025 年 11 月 27 日
C++ 越来越看不懂,语法越新越看不懂,学学 go 吧
jeffw
7
jeffw 2025 年 11 月 27 日
重载了等号操作符?感觉没啥毛病
levelworm
8
levelworm 2025 年 11 月 27 日 via iPhone
我只会写 C+class 。最爽的是用 std::unordered_map
dandeli0n
9
dandeli0n 2025 年 11 月 27 日 ❤️ 1
其实编程语言的隐式转换都是坑,不信你看一下 js
whenov
10
whenov 2025 年 11 月 27 日
这不是应该看 EntryType 的构造函数吗
allentsau
11
allentsau 2025 年 11 月 27 日 via Android
C11
jqknono
12
jqknono 2025 年 11 月 27 日
写了十几年 c++, 仍然觉得恶心, c++本身语法就繁杂, 那种很简洁的 c++只存在于各种书本里. 实际上的代码五花八门. 而且经常不得不去学习 cmake,makefile,gcc,gdb,microcode, 这里边每一个都很恶心, 宏也非常恶心. 总之它可能本身可以写的很优雅, 但是它允许各路人马以各种恶心的方式完成工作, 最气人的是没 bug 能跑, 就是人很难直接看懂. 可以说是一门标准的安卓语言.
zhouyin
13
zhouyin 2025 年 11 月 27 日
@jqknono
待遇咋样?
我十几年前还看过 c++作者吹嘘维护 cpp 代码 待遇高
cbythe434
14
cbythe434 2025 年 11 月 27 日
php 是世界上最好的语言
givenge
15
givenge 2025 年 11 月 27 日 ❤️ 7
daokedao
16
daokedao 2025 年 11 月 27 日
Rust 现在怎么样了?要不要转 Rust ?或者 Mojo ?
chutianyao
17
chutianyao 2025 年 11 月 27 日 ❤️ 1
这不是你自己的问题么

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

函数返回的"_start"是 String 类型, 你又声明需要 EntryType 类型, 自然就做了隐式转换.
就像楼上说的, 你的 EntryType 如果有 String 类型的构造函数, 自然就能编译通过(转换成 EntryType 类型); 如果不支持, 编译失败你都没机会跑这段代码.

大概率就是你的 EntryType 构造函数瞎搞, 鬼知道他会把 String 类型的值转换成啥
Tomfe
18
Tomfe 2025 年 11 月 27 日
@levelworm 做硬件的吗
Zenon
19
Zenon 2025 年 11 月 27 日
不懂,这不是很合理吗
moudy
20
moudy
OP
2025 年 11 月 27 日 ❤️ 1
@chutianyao 这是别人写的代码。如果 c++要求写 return EntryType("_start"); 用户起码知道这里可能会有坑。

还有代码写 result = xxxx(); if(result.second) result->second(); 你问这俩 second 有啥区别,呵呵,->被重载了,你猜去吧。

代码光读是没用的,每个符号都 tm 可能是别的意思。挂着 debugger 一层一层往里跟进,就跟解剖一具尸体看肠子里吃的是啥一样。
thiiadoewjwe
21
thiiadoewjwe 2025 年 11 月 27 日
C++确实太恶心了,以及各种库的适配,版本问题,动态库链接的问题...让人头大
moudy
22
moudy
OP
2025 年 11 月 27 日
@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
23
levelworm 2025 年 11 月 28 日
@Tomfe #18
大佬,我不是做硬件的,就是业余爱好写点底层的代码。
qiany
24
qiany 2025 年 11 月 28 日
Javaer 吓哭了
red13
25
red13 2025 年 11 月 28 日 ❤️ 1
@daokedao 从 c 转 rust ,前期学习成本高,后期感觉良好
ihciah
26
ihciah 2025 年 11 月 28 日 via iPad
标准委员会不是第一次犯蠢了。这帮人喜欢搞些奇怪的概念不说,还总是把名字起的贼奇怪。它不光没有防呆设计,它甚至是故意挖坑。正儿八经的 comptime feature 不搞,非要 template 歪门邪道搞元编程,绕口到给人都整出优越感了。
shilyx
27
shilyx 2025 年 11 月 28 日 ❤️ 1
委员会对语言的态度,其实该学学 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
28
XIVN1987 2025 年 11 月 28 日
这么看来,,rust 要成啊这是
qieqie
29
qieqie 2025 年 11 月 28 日 ❤️ 1
这个还得怪 C ,隐式类型转换算是 C++继承来的默认行为。不过现在单值构造函数一般的编辑器都会提示你加 explicit 吧?
roundgis
30
roundgis 2025 年 11 月 28 日 via Android
一定是錢沒給夠
sk217
31
sk217 2025 年 11 月 28 日
@shilyx

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

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

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

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

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

重载就是用来改变符号含义的,保证它不违反大多数人的直觉是编程者的责任。
iseki
36
iseki 2025 年 11 月 28 日 via Android
这个和社会分配问题不同,
yongdaimi
37
yongdaimi 2025 年 11 月 28 日
@shilyx 臣附议
Zarhani
38
Zarhani 2025 年 11 月 29 日
这个字符串返回的是指向常量区域的指针,估计是发生什么隐式转换了。
yidinghe
39
yidinghe 2025 年 11 月 29 日 via Android
Java 开发者表示看不懂:C++ 什么时候成了动态类型语言?
iceheart
40
iceheart 2025 年 12 月 6 日 via Android
别人的代码不看。能用就用,有问题就重写。
燃眉问题上调试,单步跟。
关于 · 帮助文档 · 自助推广系统 · 博客 · API · FAQ · Solana · 2541 人在线 最高记录 6679 · Select Language 创意工作者们的社区 World is powered by solitude VERSION: 3.9.8.5 · 29ms · UTC 05:10 · PVG 13:10 · LAX 21:10 · JFK 00:10
♥ Do have faith in what you're doing.

AltStyle によって変換されたページ (->オリジナル) /