V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sadwin
V2EX  ›  问与答

求教各位, c/c++中以字符串字面值作为函数调用者,这是什么语法?

  •  
  •   sadwin · 2020-07-29 10:50:38 +08:00 · 1798 次点击
    这是一个创建于 1339 天前的主题,其中的信息可能已经有所发展或是发生改变。

    像这样的

    "xxxx"->foo()
    

    在 cppreference 中,并没有找到相关的用法和解释。

    https://en.cppreference.com/w/c/language/string_literal

    https://en.cppreference.com/w/cpp/language/string_literal

    18 条回复    2020-08-04 12:14:13 +08:00
    Akiyu
        1
    Akiyu  
       2020-07-29 11:14:50 +08:00   ❤️ 1
    能提供完整一些的代码么?

    "xxxx"->foo()
    这样的形式要求 "xxxx" 是一个可调用对象, 并且是指针类型. 比如 A*
    有方法可以做到这样. 能提供详细一些的信息么? 比如 foo 是什么样的函数. 成员 or 普通函数. 等等
    sadwin
        2
    sadwin  
    OP
       2020-07-29 11:16:05 +08:00
    google 到现在,连沾点关系的问题都没找到。 难道是编译器扩展? 或者是公司代码编译之前会做 sed 把字面值给替换了?
    sadwin
        3
    sadwin  
    OP
       2020-07-29 11:20:38 +08:00
    @Akiyu 公司代码,不方便贴出来,但是形式是很简单的一句, `if ("xxxx"->foo()) ...` 这样的。 因为是服务端同事在群里发的代码截图,偶然看到了这么一句。 发现自己写 c++也有几年了,却从没发现这种用法......
    wutiantong
        4
    wutiantong  
       2020-07-29 11:41:21 +08:00   ❤️ 1
    标准范围内,没想到有什么方法能搞成这样。
    sadwin
        5
    sadwin  
    OP
       2020-07-29 11:50:24 +08:00
    @wutiantong 我也是,找不到任何信息
    wutiantong
        6
    wutiantong  
       2020-07-29 11:56:42 +08:00   ❤️ 1
    @sadwin
    operator -> 要求前面是个 class type,
    operator -> 的重载也只有 inner 形式,没有 outer 形式,
    user-defined literal 则必须要有个 suffix,
    看起来没有别的可能了。
    sadwin
        7
    sadwin  
    OP
       2020-07-29 11:58:44 +08:00
    @wutiantong 也就是说除了魔改编译器或者编译前预处理,没有别的办法了对吧?
    AlohaV2
        8
    AlohaV2  
       2020-07-29 12:09:03 +08:00 via iPhone
    搜一搜有没有奇怪的宏
    optional
        9
    optional  
       2020-07-29 12:14:00 +08:00 via iPhone
    #define ?
    limhiaoing
        10
    limhiaoing  
       2020-07-29 12:30:22 +08:00 via iPhone   ❤️ 1
    Unified Call Syntax
    limhiaoing
        11
    limhiaoing  
       2020-07-29 12:32:47 +08:00 via iPhone   ❤️ 1
    没办法发完整的链接
    jtc1/sc22/wg21/docs/papers/2015/n4474.pdf
    whi147
        12
    whi147  
       2020-07-29 17:16:48 +08:00 via iPhone
    qt 中用过,在其他地方将指针包装成 string,抛到全局,需要用的地方,找到 string 指的地址转成指针。说白了就是地址位置传递。
    whi147
        13
    whi147  
       2020-07-29 17:19:41 +08:00 via iPhone
    qt 的全局指针是 qApp,通过这个来传递的。
    sadwin
        14
    sadwin  
    OP
       2020-08-03 11:00:48 +08:00
    @whi147 是字符串字面值,并不是 string 哦...
    whi147
        15
    whi147  
       2020-08-03 11:46:47 +08:00 via iPhone
    可是你写的是 char[]
    sadwin
        16
    sadwin  
    OP
       2020-08-03 14:50:14 +08:00
    @whi147 可能是我表述不清楚,我看到的代码并不是这样的:
    ``` c++
    char *foo = "something";
    ...
    foo->bar();
    ```
    而是直接:
    ``` c++
    "zhangsan"->bar();
    ```
    这样子的。
    和你说的情景应该不是同一个。

    最有可能的做法没准就是按照 11 楼来的。要么就是预处理
    sadwin
        17
    sadwin  
    OP
       2020-08-03 14:50:56 +08:00
    啊,我擦,回帖不能用 markdown 吗...
    whi147
        18
    whi147  
       2020-08-04 12:14:13 +08:00 via iPhone
    哦。这样啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2842 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:20 · PVG 21:20 · LAX 06:20 · JFK 09:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.