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

推荐答案

这些声明

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

类似于声明,例如

typedef int T;
T *int_ptr; 

因此,为函数类型引入别名的tyecif没有什么问题.

请注意,该tyecif声明

typedef void (func_type)(void);

相当于

typedef void func_type(void);

本声明

func_type func_obj;

声明一个类型为void( void )、名称为func_obj的函数.

例如,这样的声明允许在一行中列出函数,而无需重复它们的参数列表.

这句话

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

根据C标准是无效的,因为您不能将sizeof运算符应用于函数.

来自C标准(6.5.3.4运算符的大小和对齐)

1The sizeof operator shall not be applied to an expression that has function type或不完整的类型,添加到此类型的括号名称 类型,或指定位域成员的表达式.这个 Alignof运算符不应应用于函数类型或 类型不完整.

然而,一些编译器可能具有与C标准相冲突的自己的扩展.

C++相关问答推荐

为什么这个C程序代码会产生以下结果?

字符数组,字符指针,在一种情况下工作,但在另一种情况下不工作?

ATTiny1606定时器TCA 0中断未触发

exit(EXIT_FAILURE):Tcl C API类似功能

ESP32在vTaskDelay上崩溃

如何将字符串传递给函数并返回在C中更改的相同字符串?

调用mProtection将堆栈上的内存设置为只读,直接导致程序SIGSEGV

函数内的局部字符指针

N的值设置为0或1(未定义的行为),而我正在try 学习realloc和Malloc的用法

1处的解析器错误:yacc语法的语法错误

这个计算C中阶乘的函数正确吗?

-Wnonnull-Compare警告不是具有误导性吗?

这段代码用于在C中以相反的顺序打印数组,但它不起作用

不使用任何预定义的C函数进行逐位运算

当我将偏移量更改为任何非零值时,C中的mmap共享内存出现无效参数错误

在C中交换字符串和数组的通用交换函数

无法将字符串文字分配给 C 中的字符数组

在 C23 之前如何对空指针使用nullptr?

如何确定 C 程序中的可用堆内存

如何让 unlinkat(dir_fd, ".", AT_REMOVEDIR) 工作?