typedef void (func_type)(void);
func_type *func_ptr;
这是定义函数指针的正确方法吗?
#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
这是定义函数指针的正确方法吗?
是的。
我更喜欢定义一个函数类型,然后使用
*
。立即可见 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(函数名称)”返回什么? .
这个物体可以用来做什么?
嗯,就像一个函数,用于调用它。别名可用于保持函数类型同步。
这些声明
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 运算符不应应用于函数类型或 不完整类型。