再一次感觉到 C++的恶心 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
moudy
V2EX    C++

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

  •  
  •   moudy 2 天前 4142 次点击

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

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

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

    div class="box">
    37 条回复    2025-11-28 17:57:51 +08:00
    carlself
        1
    carlself  
       2 天前   3
    &t=99s 看看这个视频解压一下,喷了两个小时 C++
    aloxaf
        2
    aloxaf  
       2 天前
    @carlself 好家伙,两个小时,这作者对 C++ 是真爱啊
    yolee599
        3
    yolee599  
       2 天前 via Android   2
    我就是能用 C 就不用 C++
    songray
        4
    songray  
       2 天前   1
    @carlself 这个视频我完整的看完了...
    最搞的是,从 GitHub 主页来看,这作者真的是 C++ 的高级开发,吐槽的也都在点子上。

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

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

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

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

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

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

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

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

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

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

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

    重载就是用来改变符号含义的,保证它不违反大多数人的直觉是编程者的责任。
    iseki
        36
    iseki  
       23 小时 38 分钟前 via Android
    这个和社会分配问题不同,
    yongdaimi
        37
    yongdaimi  
       22 小时 32 分钟前
    @shilyx 臣附议
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2760 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 08:30 PVG 16:30 LAX 00:30 JFK 03:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86