在C中定义函数指针?

问题描述 投票:0回答:2
  1. 最近我发现了一种令人惊讶的在 C 中定义函数指针的方法:
typedef void (func_type)(void);
func_type *func_ptr;

这是定义函数指针的正确方法吗?

  1. 如果我们定义 func_obj 如下,这个对象的类型是什么以及这个对象可以用来做什么?
#include <stdio.h>

typedef void (func_type)(void);
func_type *func_ptr;

func_type func_obj;

int main()
{
  printf("Size of func_obj: %zu\n", sizeof func_obj);
  printf("Size of func_ptr: %zu\n", sizeof func_ptr);
  return 0;
}

代码打印:

Size of func_obj: 1
Size of func_ptr: 8
c types function-pointers
2个回答
0
投票

这是定义函数指针的正确方法吗?

是的。

我更喜欢定义一个函数类型,然后使用

*
。立即可见
func_type *
是一个指针,而
typedef void (*func_type)(void); func_type func;
隐藏了该信息。

func_obj如下,这个对象是什么类型?

func_obj
实际上是一个函数。考虑:

#include <stdio.h>
typedef void func_type(void);
// forward declaration of a function
void func_obj(void);
// typedef is just an alias, exactly the same as above
func_type func_obj;
// for function definition, we have to use a ()
void func_obj(void) {
    printf("Inside func_obj\n");
}
int main() {
     func_obj();
}

这样做

sizeof(func_obj)
在技术上是无效的 - “sizeof(函数名称)”返回什么? .

这个物体可以用来做什么?

嗯,就像一个函数,用于调用它。别名可用于保持函数类型同步。


0
投票

这些声明

typedef void (func_type)(void);
func_type *func_ptr;

类似于声明,例如

typedef int T;
T *int_ptr; 

因此,typedef 为函数类型引入别名并没有什么问题。

本声明

func_type func_obj;

声明一个名为

func_obj
、类型为
void( void )
的函数。

本声明

printf("Size of func_obj: %zu\n", sizeof func_obj);

无效,因为您不能将

sizeof
运算符应用于函数。

来自 C 标准(6.5.3.4 sizeof 和alignof 运算符)

1 sizeof 运算符不应应用于具有 函数类型或不完整类型,到此类的括号名称 类型或指定位字段成员的表达式。这 alignof 运算符不应应用于函数类型或 不完整类型。

© www.soinside.com 2019 - 2024. All rights reserved.