复杂的C类型和布尔表达式解释

Complicated C type and Boolean expression explanation

使用 GDB 我有以下数据:

ptype phases
type = _Bool (*[6])(char *)

ptype phases[0]
type = _Bool (*)(char *)

首先,变量phases的类型英文是什么?我是 GDB 和 C 的新手,所以我不确定这是 C 中的类型还是 GDB 中的某些显示约定。如果我执行以下操作:

p phases
 = {0x400880 <phase0>, 0x4008c0 <phase1>, 0x400920 <phase2>, 0x400a10 <phase3>, 0x400ba0 <phase4>, 0x400c50 <phase5>}

数据在 GDB 中的呈现方式,phases 是布尔值、字符串对的数组吗?

第二个问题,我有下面这行逻辑我不明白(针对这个问题做了简化):

if(!((phases[0])("test"))) {

我不知道这个表达式是如何求值的。 phases[0] 给出一个 _Bool (*)(char *)。然后我们有 "test" 字符指针,在它和 phases[0] 之间没有显式操作。这是如何评估的,这叫什么?

你这里有一个函数指针数组,其中每个函数接受一个 char * 参数和 returns 一个 _Bool.

查看给定的表达式:

(!((phases[0])("test")))

phases[0]是数组中的单个函数指针。它以 "test" 作为参数调用 ((phases[0])("test"))。然后返回的 _Bool 值用逻辑 NOT 运算符取反 !.