这个复杂的 C 类型声明是什么意思?
What does this convoluted C type declaration mean?
在我所在的编程社区中,有人将这颗绝对的手榴弹扔进了聊天室:
this is a valid function declaration in c
void* volatile* (*func(unsigned long const long volatile int, signed, long*[*][42]))(__int128* (*) (int* restrict const[static restrict const 17]));
我们中的一些人曾尝试破译这份声明,但目前还没有人有好运。
如果将函数声明表示出来会更容易理解函数声明
void* volatile* (*func(unsigned long const long volatile int, signed, long*[*][42]))(__int128* (*) (int* restrict const[static restrict const 17]));
使用类型定义。
第一个可以是下面的
typedef _int128* FunctionAsParameter(int* restrict const[static restrict const 17]);
第二个如下
typedef void* volatile* FunctionAsReturnType( FunctionAsParameter * );
最后原始函数声明看起来像
FunctionAsReturnType * func( unsigned long const long volatile int, signed, long*[*][42]);
那是函数的 return 类型 func
是一个指向函数的指针,它有一个参数,而这个参数又是指向函数的指针。
这个其实很简单,因为函数类型没有名字
在他们的参数列表中,所以这里唯一的名字是声明符 func
。所以你就从那里开始出去。
func
后跟 (
所以它是一个函数,前面是 *
所以它 returns 是一个指向某物的指针。您需要找到匹配的 )
来找到参数列表的末尾,这有点棘手,但是当您这样做时,您会找到另一个参数列表,因此返回的指针是指向函数的指针,并且该函数 returns 声明前面的 void * volatile *
。然后你可以解码涉及的两个函数的参数类型,但是它们很漂亮straight-forward,除了你可以忽略的冗余说明符和限定符。
使用螺旋法则:
void* volatile* (*func(unsigned long const long volatile int,
signed,
long*[*][42])
)(__int128* (*) (int* restrict const[static restrict const 17]));
func
是一个接受 volatile const unsigned long long
的函数,
一个 int
和一个指向可变长度数组的初始元素的指针,该数组包含 42 个指向 long
的指针,返回一个指向函数 F1 的指针函数 F2 接受一个指向数组初始元素的常量指针,该数组至少有 17 个常量指针指向 int
,返回指向 __int128
本身的指针(F1) 返回指向 void *
的 volatile
指针...或接近于此的指针。
- 此处的
restrict
关键字仅供函数原型中的参考。
- 将函数参数限定为
volatile
和/或 const
是不常见的,并且在函数原型中可能没有用。
在我所在的编程社区中,有人将这颗绝对的手榴弹扔进了聊天室:
this is a valid function declaration in c
void* volatile* (*func(unsigned long const long volatile int, signed, long*[*][42]))(__int128* (*) (int* restrict const[static restrict const 17]));
我们中的一些人曾尝试破译这份声明,但目前还没有人有好运。
如果将函数声明表示出来会更容易理解函数声明
void* volatile* (*func(unsigned long const long volatile int, signed, long*[*][42]))(__int128* (*) (int* restrict const[static restrict const 17]));
使用类型定义。
第一个可以是下面的
typedef _int128* FunctionAsParameter(int* restrict const[static restrict const 17]);
第二个如下
typedef void* volatile* FunctionAsReturnType( FunctionAsParameter * );
最后原始函数声明看起来像
FunctionAsReturnType * func( unsigned long const long volatile int, signed, long*[*][42]);
那是函数的 return 类型 func
是一个指向函数的指针,它有一个参数,而这个参数又是指向函数的指针。
这个其实很简单,因为函数类型没有名字
在他们的参数列表中,所以这里唯一的名字是声明符 func
。所以你就从那里开始出去。
func
后跟 (
所以它是一个函数,前面是 *
所以它 returns 是一个指向某物的指针。您需要找到匹配的 )
来找到参数列表的末尾,这有点棘手,但是当您这样做时,您会找到另一个参数列表,因此返回的指针是指向函数的指针,并且该函数 returns 声明前面的 void * volatile *
。然后你可以解码涉及的两个函数的参数类型,但是它们很漂亮straight-forward,除了你可以忽略的冗余说明符和限定符。
使用螺旋法则:
void* volatile* (*func(unsigned long const long volatile int,
signed,
long*[*][42])
)(__int128* (*) (int* restrict const[static restrict const 17]));
func
是一个接受 volatile const unsigned long long
的函数,
一个 int
和一个指向可变长度数组的初始元素的指针,该数组包含 42 个指向 long
的指针,返回一个指向函数 F1 的指针函数 F2 接受一个指向数组初始元素的常量指针,该数组至少有 17 个常量指针指向 int
,返回指向 __int128
本身的指针(F1) 返回指向 void *
的 volatile
指针...或接近于此的指针。
- 此处的
restrict
关键字仅供函数原型中的参考。 - 将函数参数限定为
volatile
和/或const
是不常见的,并且在函数原型中可能没有用。