我想声明一个指向函数的指针类型,所以我尝试:
typedef void (*print)(void);
完美无缺
void (*print)(void);
p是一个ponter变量,而不是一个类型。
typedef (void) (*print)(void);
错误预期标识符或'('在'void'之前
typedef void (*)(void) Print;
错误:在'打印'之前预期'=',',',';','asm'或'_ 属性 _'。
我的问题是:
我是否必须使用typedef
来声明函数指针类型?
为什么typedef (void) (*print)(void);
错了? ()
在这里的含义是什么?
为什么我不能用这种方式写作:typedef void (*)(void) Print
?
答案 0 :(得分:11)
正确的方法是:
typedef void (*print_function_ptr)(void)
及其对变量/参数声明的用法是:
print_function_ptr p;
您不需要typedef来声明变量。您可以直接编写void (*p)(void)
来声明一个变量p
,该变量指向一个取void
并返回void
的函数。但是,要为函数指针声明类型别名/名称,typedef
就是工具。
这并不意味着它不是有效的C语法。
因为它不是C的工作方式。 C中的Typedef模仿了如何声明或定义变量。
答案 1 :(得分:3)
不,您不必使用typedef
来创建“指向函数的指针”类型的对象:
void somefunc(void (*pointer)(void))
{
(*pointer)();
pointer();
}
但是,除了使用typedef
之外,无法为其他类型创建名称。我想你可以沉迷于宏hackery来生成一个'指向函数的指针',但是在扩展宏之后,你会写出一个'指向函数的指针':
#define PTR_FUNC(func) void (*func)(void)
void somefunc(PTR_FUNC(pointer)) { ... }
(void)
表示法作为类型名称是错误的。你不写:(int) x;
并期望声明一个变量x
- 它是一个类型转换。与您在typedef
中使用的符号相同。
您无法编写typedef void (*)(void) Print;
,因为它不是允许的C语法。你也不能写typedef [32] int name;
- 它不是有效的C语法。