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

移植了一个库,眼睛快要瞎了。

  •  
  •   xuegy · 2021-03-10 05:50:35 +08:00 via iPhone · 5973 次点击
    这是一个创建于 1388 天前的主题,其中的信息可能已经有所发展或是发生改变。
    源代码只支持 gcc 编译,clang 疯狂报错 ambiguous 。一边编译一边对着报错信息改,一共改了四百行,几乎全都是把 xxx A=B; 改成 xxx A(B);
    眼睛都快要瞎了。我是该吐槽 gcc 下限太低什么玩意都给编译呢,还是该吐槽 clang 严格遵守标准过于死板呢?
    第 1 条附言  ·  2021-03-10 10:42:45 +08:00
    给原作者发了一个 pull request,他拒绝了,估计是改了这么多行有歧义代码伤了他的自尊心...
    36 条回复    2021-03-11 22:24:09 +08:00
    codehz
        1
    codehz  
       2021-03-10 06:04:20 +08:00
    哎,不应该改成 xxx A{B}; 吗
    xuegy
        2
    xuegy  
    OP
       2021-03-10 06:08:53 +08:00 via iPhone
    @codehz 圆括号能用为啥要非要上花括号?
    Tony042
        3
    Tony042  
       2021-03-10 06:13:48 +08:00 via iPhone
    @xuegy 两个还是不太一样,花括号是 initializer_list,两个略有区别,我也不太清了,依稀记得花括号会更好一些,可以防止一些歧义。
    Tony042
        4
    Tony042  
       2021-03-10 06:14:21 +08:00 via iPhone
    为啥不写个 operator=直接考虑类型转换
    xuegy
        5
    xuegy  
    OP
       2021-03-10 06:18:01 +08:00 via iPhone
    @Tony042 非要这样写就默认至少 C++11 了吧,兼容性咋办?
    BrettD
        6
    BrettD  
       2021-03-10 07:06:07 +08:00
    禁用 clang 编译警告(-Wno-everything )解千愁(逃
    kokutou
        7
    kokutou  
       2021-03-10 07:19:06 +08:00 via Android
    感觉可以写个脚本批量处理吧。。。
    BrettD
        8
    BrettD  
       2021-03-10 07:23:00 +08:00 via iPhone
    哦没事了,原来是编译错误
    kekxv
        9
    kekxv  
       2021-03-10 07:50:14 +08:00 via iPhone
    永 gcc 编译为动态库或者静态库来用?
    geelaw
        10
    geelaw  
       2021-03-10 07:50:49 +08:00
    @Tony042 #4 这里需要的是 ctor 不是 operator=。

    @xuegy #2 因为 https://en.wikipedia.org/wiki/Most_vexing_parse
    但比较奇怪,一般来说用 = 初始化不会有歧义问题,反而是用函数调用初始化容易有“最烦人的解读”。
    wnpllrzodiac
        11
    wnpllrzodiac  
       2021-03-10 08:12:39 +08:00 via Android
    写个 py 脚本搞?
    wnpllrzodiac
        12
    wnpllrzodiac  
       2021-03-10 08:14:17 +08:00 via Android
    @Tony042 最好都用 花瓜号(侯杰大师发音),比较保险
    feather12315
        13
    feather12315  
       2021-03-10 08:42:54 +08:00 via Android
    sed 一行的事情
    AndyAO
        14
    AndyAO  
       2021-03-10 08:44:54 +08:00
    感觉这种事情应该写个脚本来解决吧,甚至正则表达式,也有可能直接全部解决
    lifanxi
        15
    lifanxi  
       2021-03-10 08:46:56 +08:00
    我没有理解为什么 clang 要报有歧义,如果 xxx 类的构造函数和类型转换函数没有花式作死的话,xxx A=B;就是调用拷贝构造函数通过 B 构造 A,好像没啥歧义啊。
    cominghome
        16
    cominghome  
       2021-03-10 08:58:22 +08:00
    所以说程序员掌握一门脚本语言也是很重要的
    lcdtyph
        17
    lcdtyph  
       2021-03-10 09:02:46 +08:00 via iPhone
    @lifanxi
    不一样,xxx A(B);是 direct initialization,而 xxx A=B;是 copy initialization
    区别是当 AB 类型不同时 copy initialization 会考虑隐士转换,从而引入另一条构造路径导致歧义。
    解决方法之一可以在正确的地方使用 explicit
    mlhadoop
        18
    mlhadoop  
       2021-03-10 09:06:02 +08:00
    还以为做了啥手术 /doge
    nmap
        19
    nmap  
       2021-03-10 09:51:36 +08:00
    还以为你移植了眼睛
    pluxj
        20
    pluxj  
       2021-03-10 10:09:53 +08:00
    用 花括号 {} 好一些,不然可能认为你在声明一个函数
    cyrbuzz
        21
    cyrbuzz  
       2021-03-10 10:49:48 +08:00
    (.+) (.+) = (.+);
    $1 $2($3);
    cyrbuzz
        22
    cyrbuzz  
       2021-03-10 10:50:20 +08:00
    @cyrbuzz
    vscode,单行开正则...
    xuegy
        23
    xuegy  
    OP
       2021-03-10 10:53:11 +08:00
    我也想过写脚本解决,但是很多没错的地方也符合你这种正则表达式...
    xuegy
        24
    xuegy  
    OP
       2021-03-10 10:55:20 +08:00
    @cyrbuzz 反正已经改完了,以后也不用再改第二次。
    cyrbuzz
        25
    cyrbuzz  
       2021-03-10 10:59:08 +08:00
    @xuegy

    好吧~,have a good day~.
    se77en
        26
    se77en  
       2021-03-10 11:34:27 +08:00
    @pluxj 花括号分场合的,不能一概而论,建议读一下 Google 的这个 Tip: https://abseil.io/tips/88
    twor2
        27
    twor2  
       2021-03-10 12:48:31 +08:00
    @wnpllrzodiac 看了几个台湾人节目, 括好像都是发瓜的音,比较常见的词,是 包瓜(包括)
    whee1
        28
    whee1  
       2021-03-10 15:01:42 +08:00 via iPhone
    你太死板了吧,别人的代码,修改编译选项让它过就是了,何必为难自己呢。
    xuegy
        29
    xuegy  
    OP
       2021-03-10 15:47:52 +08:00 via iPhone
    @whee1 我要移植过来自己用,得先把坑填上啊
    whee1
        30
    whee1  
       2021-03-10 16:05:44 +08:00
    @xuegy #29 我昨天也干过类似的事情:给一套代码的析构函数加 19 个 noexcept 。
    linux40
        31
    linux40  
       2021-03-10 17:19:53 +08:00 via Android
    @whee1 析构函数本身默认 noexcept 的,不用手动加。
    jones2000
        32
    jones2000  
       2021-03-10 23:00:53 +08:00
    我 c++库 15 万行,移植到 js, 小程序, py 3 个平台, 移植了 7 个月. 还包括测试.
    https://github.com/jones2000/HQChart
    xuegy
        33
    xuegy  
    OP
       2021-03-11 04:52:56 +08:00 via iPhone
    @jones2000 你这个太狠了,我只是从 Linux 移到到 Mac 。
    pluxj
        34
    pluxj  
       2021-03-11 09:28:32 +08:00
    @se77en get
    whee1
        35
    whee1  
       2021-03-11 09:41:41 +08:00 via iPhone
    @linux40 #31 而我改的代码却是 noexcept(false)。
    levelworm
        36
    levelworm  
       2021-03-11 22:24:09 +08:00
    @Tony042 我记得好像是 initializer list 比 copy constructor 快一点
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5453 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:27 · PVG 16:27 · LAX 00:27 · JFK 03:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.