C 最令人烦恼的解析
在 C 中,解析代码片段的方式可能会导致意外的行为。一个臭名昭著的例子被称为“最令人烦恼的解析”。
函数声明之谜
考虑以下代码:
widget w(gadget(), doodad());
乍一看,它似乎声明了一个名为 w 的 widget 类型的变量。然而,这段代码实际上定义了一个名为 w 的函数,它接受两个参数。
参数衰减和指针转换
在函数声明中,数组类型的参数衰减为指针到第一个元素,函数类型的参数衰减为函数指针。因此,w 的等效声明是:
widget w(gadget(*)(), doodad(*)());
这意味着函数 w 将一个指向不带参数并返回小工具的函数的指针作为其第一个参数。它还需要第二个参数,一个指向不带参数并返回小玩意的函数的指针。该函数本身返回一个小部件。
额外的复杂性
“最令人烦恼的解析”在以下情况下变得更加混乱:
widget w(gadget(x));
如果 x 已经是一个变量,如何将其解释为函数声明?答案在于,在 C 中,声明变量时可以使用额外的括号。因此,小工具 x;和小工具(x);两者都声明了名为 x 的相同变量。因此,上面的代码是一个函数的声明,该函数采用名为 x 的 gadget 类型的第一个参数,并返回一个小部件。
以上是什么是 C 的'最令人烦恼的解析”以及它如何误导函数声明?的详细内容。更多信息请关注PHP中文网其他相关文章!