这个复杂的 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 是不常见的,并且在函数原型中可能没有用。