V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ligiggy
V2EX  ›  程序员

[C++] typedef 指针函数问题

  •  
  •   ligiggy · 2020-05-29 17:25:45 +08:00 · 1957 次点击
    这是一个创建于 1670 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己瞎写了一段代码,如下:

    typedef char* pFunc(char*);
    
    char* func1(char * p)
    {
    	cout << p << endl;
    
    	return p;
    }
    
    int main()
    {
    	pFunc (*c);
    
    	c = func1;
    
    	c("123");
    }
    

    这样使用的时候是 OK 的。

    但是不能这样初始化一个变量,VC++编译器会提示:“=”不是左操作数

    
    pFunc(c);
    
    c = func1;
    
    

    也不能这样

    
    pFunc c;
    
    c = func1;
    

    搜不到一个比较合理的解释,请大佬赐教!

    22 条回复    2020-05-30 14:43:21 +08:00
    loriann
        1
    loriann  
       2020-05-29 17:31:14 +08:00
    c 是什么? 没看懂
    ligiggy
        2
    ligiggy  
    OP
       2020-05-29 17:31:45 +08:00
    @loriann c 是定义的变量名啊
    loriann
        3
    loriann  
       2020-05-29 17:34:55 +08:00
    c 是什么类型的变量呢?
    ligiggy
        4
    ligiggy  
    OP
       2020-05-29 17:36:23 +08:00 via iPhone
    @loriann pFunc 啊
    AlohaV2
        5
    AlohaV2  
       2020-05-29 17:38:59 +08:00 via iPhone
    typedef 返回值类型 (*函数名字)(参数...)
    建议楼主早日用上 c++11,std::function 好用一些.
    ligiggy
        6
    ligiggy  
    OP
       2020-05-29 17:43:21 +08:00 via iPhone
    @AlohaV2 你这个也不对啊,不是函数指针。
    loriann
        7
    loriann  
       2020-05-29 17:44:42 +08:00
    哎,真是上火。怀疑自己多年 c++是不是喂了狗了。你可以这样用 pFunc* c = func1
    ligiggy
        8
    ligiggy  
    OP
       2020-05-29 17:47:38 +08:00 via iPhone
    @loriann 卧槽好像是的。我的 c++喂了狗😂
    TaylorJack123
        9
    TaylorJack123  
       2020-05-29 17:56:51 +08:00 via iPhone
    你这 typedef 写错了,应该是 char* (*pFunc)(char*);
    soy
        10
    soy  
       2020-05-29 17:57:46 +08:00   ❤️ 1
    ligiggy
        11
    ligiggy  
    OP
       2020-05-29 17:58:24 +08:00 via iPhone
    @TaylorJack123 凭什么说我写错了?
    ligiggy
        12
    ligiggy  
    OP
       2020-05-29 17:59:19 +08:00 via iPhone
    @soy 666666666666
    SPACELAN
        13
    SPACELAN  
       2020-05-29 18:02:09 +08:00
    还可以这样写

    char* (*c)(char*) = func1;

    懂我的意思吧
    ligiggy
        14
    ligiggy  
    OP
       2020-05-29 18:02:41 +08:00 via iPhone
    pright
        15
    pright  
       2020-05-29 18:10:47 +08:00
    楼主这样写也没问题的,你把那个括号去掉就好理解了。
    pFunc *c;
    pright
        16
    pright  
       2020-05-29 18:12:09 +08:00
    EXAMPLE 4 On the other hand, typedef names can be used to improve code readability. All three of the
    following declarations of the signal function specify exactly the same type, the first without making use
    of any typedef names.
    typedef void fv(int), (*pfv)(int);
    void (*signal(int, void (*)(int)))(int);
    fv *signal(int, fv *);
    pfv signal(int, pfv);
    pright
        17
    pright  
       2020-05-29 18:12:16 +08:00
    ligiggy
        18
    ligiggy  
    OP
       2020-05-29 18:33:00 +08:00 via iPhone
    @pright 嗯,谢谢指教。已经悟到了。这么些年白学了,偶然发现自己几年前写的博客,竟然看不懂了。
    ashong
        19
    ashong  
       2020-05-29 18:40:51 +08:00
    typedef 格式不对

    ```
    typedef char* (*pFunc)(char*);

    char* func1(char * p)
    {
    std::cout << p << std::endl;

    return p;
    }

    int main()
    {
    pFunc c;

    c = func1;

    c("123");

    return 0;
    }
    ```
    livepps
        20
    livepps  
       2020-05-29 18:41:49 +08:00 via Android
    pFunc 要声明指针函数吧,声明有问题
    levelworm
        21
    levelworm  
       2020-05-29 21:08:51 +08:00 via Android
    这是函数吧?
    还有,我绝逼在之前看到完全一样的问题,deja vu,这是怎么了!
    TaylorJack123
        22
    TaylorJack123  
       2020-05-30 14:43:21 +08:00 via iPhone
    @ligiggy 我错了,恭喜你写对了^_^
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5766 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 01:45 · PVG 09:45 · LAX 17:45 · JFK 20:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.