如何在一个 typedef 声明中声明多个函数指针类型?
How can I declare multiple function pointer types in one typedef declaration?
我可以
typedef int a, b;
但我做不到
typedef void(*the_name_1, *the_name_2)(...);
有没有办法同时 typedef 2 个函数指针类型?
C/C++ 中的多个声明具有误导性,因为 *
链接到变量而不是类型:
typedef int a, *b, (*c)();
static_assert(std::is_same_v<int, a>);
static_assert(std::is_same_v<int*, b>);
static_assert(std::is_same_v<int (*)(), c>);
所以你的one-liner会是
typedef void(*the_name_1)(...), (*the_name_2)(...);
暂时忽略typedef
。
void (*the_name_1, *the_name_2)(...);
请记住,C 声明(以及 C++,大部分)遵循“声明反映使用”的规则,这表示 (*the_name_1, *the_name_2)
是一个可以用任何参数调用的表达式,返回 void
。这使 the_name_2
成为一个指向函数的指针,该函数接受任何内容并返回 void,但它不会告诉您任何有关 the_name_1
类型的信息,除了它应该可以取消引用之外。
这就是为什么 让你写了两次参数列表。这样你就可以说 the_name_1
和 the_name_2
都可以被取消引用,然后用任何东西调用,给你 void
。它完全类似于
char foo[42], bar[69];
唯一的区别 typedef
是声明的名称成为 otherwise-declared 变量将具有的类型的名称。
我可以
typedef int a, b;
但我做不到
typedef void(*the_name_1, *the_name_2)(...);
有没有办法同时 typedef 2 个函数指针类型?
C/C++ 中的多个声明具有误导性,因为 *
链接到变量而不是类型:
typedef int a, *b, (*c)();
static_assert(std::is_same_v<int, a>);
static_assert(std::is_same_v<int*, b>);
static_assert(std::is_same_v<int (*)(), c>);
所以你的one-liner会是
typedef void(*the_name_1)(...), (*the_name_2)(...);
暂时忽略typedef
。
void (*the_name_1, *the_name_2)(...);
请记住,C 声明(以及 C++,大部分)遵循“声明反映使用”的规则,这表示 (*the_name_1, *the_name_2)
是一个可以用任何参数调用的表达式,返回 void
。这使 the_name_2
成为一个指向函数的指针,该函数接受任何内容并返回 void,但它不会告诉您任何有关 the_name_1
类型的信息,除了它应该可以取消引用之外。
这就是为什么 the_name_1
和 the_name_2
都可以被取消引用,然后用任何东西调用,给你 void
。它完全类似于
char foo[42], bar[69];
唯一的区别 typedef
是声明的名称成为 otherwise-declared 变量将具有的类型的名称。