【问题标题】:Typedef with function pointers in C?Typedef与C中的函数指针?
【发布时间】:2012-01-17 03:49:58
【问题描述】:

我是 C 的新手,我很难阅读这行代码并理解它:

typedef void (*getnxtbyte_t)(void *stream);

环顾四周,我现在知道这是一个指向函数的指针。但是任何人都可以帮助我进一步澄清这一点吗?这种新类型的名称是什么?它指向什么功能?函数的参数是(void* stream)吗?

提前致谢!

【问题讨论】:

标签: c function-pointers typedef


【解决方案1】:

这是一个很难习惯的语法。

这种新类型的名称是什么?

类型是getnxtbyte_t。 (您可以将结尾的 _t 读作“类型”。这是一种流行的约定。)

getnxtbyte_t 类型的变量可以保存一个函数的地址,该函数接受一个void * 参数并返回类型为void

它指向什么函数?

错误的问题。

该代码仅定义类型。没有变量被创建,所以没有“它”指向任何东西。

如果您知道具有正确签名的函数,例如:

void some_func(void*) {}

您现在可以使用该 typedef 创建指向它的指针:

getnxtbyte_t my_function_pointer = some_func;

【讨论】:

    【解决方案2】:

    这个typedef 创建了一个名为getnxtbyte_t 的类型。该类型用于指向返回void(即什么都没有)的函数的指针,如第二个单词所示。该函数采用单个参数,即void *,由stream 显示。

    如果你有一个声明如下的函数:

    void some_function(void *any_name);
    

    然后您可以使用typedef,就像您帖子中的那样:

    void *some_param = NULL;
    typedef void (*getnxtbyte_t)(void *stream); // declare typedef
    getnxtbyte_t func = some_function; // assign
    func(some_param); // call
    

    【讨论】:

      【解决方案3】:

      函数指针类型名称为getnxtbyte_t。它现在没有指向任何东西——这是一个 type 的指针,而不是一个实际的指针。就像说

      typedef struct foo {int x;} Foo;
      

      您定义了一个类型Foo,但没有该类型的实际实例。最后,是的,该函数接受一个 void* 参数,并返回 void

      【讨论】:

        【解决方案4】:

        我也是C新手,如有错误请指正。


        指向函数的指针格式如下:

        datatype (*POINTER_NAME)(PARAMETERS);
        

        这就是指向函数返回的数据类型指针的名称和指向函数采用的参数


        以下是函数指针与普通函数声明相比的外观:

        // normal function declaration
        void getnxtbyte_t(void *stream);
        
        // function pointer
        void (*getnxtbyte_t)(void *stream);
        


        typedef 允许我们创建自己的类型。

        // will create a type called getnxtbyte_t
        typedef void (*getnxtbyte_t)(void *stream);
        


        此时我们只声明了一个类型;我们没有指向任何东西。所以让我们创建一个名为func_ptr 的指针并将其指向一个函数。

        // func_ptr is a pointer of type getnxtbyte_t
        getnxtbyte_t func_ptr = another_function;
        
        // calling func_ptr is now the same as calling another_function
        func_ptr(an_argument);
        
        // had we not used typedef, we would type:
        void (*getnxtbyte_t)(void *stream) = another_func;
        getnxtbyte_t(an_argument);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-03
          • 2010-12-08
          • 2011-05-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多