加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – typedef如何用于函数指针

发布时间:2020-12-16 09:13:51 所属栏目:百科 来源:网络整理
导读:我想我可能患有可怕的“偶然程序员”疾病,至少在涉及typedef和函数指针时.所以我一直在试验各种涉及这些的组合,根据我得到的所有输出来分析结果. 但是,当我继续尝试不同的组合,而不是分析结果,我现在只是在过程中丢失. 我希望你们能帮助我弄清楚这个烂摊子.
我想我可能患有可怕的“偶然程序员”疾病,至少在涉及typedef和函数指针时.所以我一直在试验各种涉及这些的组合,根据我得到的所有输出来分析结果.

但是,当我继续尝试不同的组合,而不是分析结果,我现在只是在过程中丢失.

我希望你们能帮助我弄清楚这个烂摊子.

第一个代码示例

typedef void (print)(void);
void do_something (void) { printf("Hello Worldn"); }

print *pr;
pr = &do_something;
pr(); // Hello World

第二个代码示例

typedef void (print)(void);
void do_something (void) { printf("Hello Worldn"); }

print *pr;
pr = do_something;
pr(); // Hello World

上面的代码示例如何工作,就好像’&’对函数名称没有影响

第三个代码示例

typedef void (print)(void);
void do_something (void) { printf("Hello Worldn"); }

print pr;
pr = do_something; // compile error
pr = &do_something; // compile error
pr();

我希望上面的任务之一在这里工作,但该死的!我真的不懂函数指针(也可能是typedef).

解决方法

函数名称的地址和普通函数名称都是相同的,所以&对函数名称没有影响.

同样,在使用函数指针时,多个解除引用不是问题:

#include <stdio.h>
typedef void print(void);
static void dosomething(void) { printf("Hello Worldn"); }

int main(void)
{
    print *f1 = dosomething;
    print *f2 = &dosomething;
    f2();
    (f1)();
    (*f1)();
    (**f2)();
    (***f1)();
    (****f2)();
    (*****f1)();
}

在以下情况下完全编译:

gcc -O3 -g -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes 
    -Wold-style-definition -std=c99 xx.c -o xx

我不会说多颗星是好风格;事实并非如此.它是’奇怪的,(是的,你可能会说)反常’.一个就足够了(一个星星主要是像我这样的人,在标准之前学会用C编程说“可以通过指针调用函数而不使用(* pointer_to_function)(arg1,arg2)表示法;你如果你喜欢“),可以写出pointer_to_function(arg1,arg2).是的,这很奇怪.不,没有其他类型(或类别)表现出相同的行为,谢天谢地.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读