在“C ++对象模型内部”中,作者给出了以下可能不明确的代码示例,要求解析器预先解决它:
...如果C ++要抛弃C声明语法,则不需要lookahead来确定以下是pf的调用而不是它的定义:
// don’t know if declaration or invocation // until see the integer constant 1024 int ( *pf )( 1024 );
他暗示这被解释为函数pf
的调用。我无法看到pf
的声明可以使这成为一个有效的调用。
答案 0 :(得分:2)
int ( *pf )( int);
- 这是宣言
答案 1 :(得分:2)
这是一个名为int*
pf
的丑陋声明,其初始值为1024.但是,如果没有显式强制转换,此转换无效:
int ( *pf )((int*)1024);
因此,问题中给出的行等同于:
int* pf = 1024;
要了解原因,请考虑int ((((*pf))));
与int* pf;
相同。您可以在声明者周围添加任意数量的括号。
在声明
T D
中D
的形式为<( D1 )
包含的 declarator-id 的类型与声明中包含的 declarator-id 的类型相同T D1
括号不会改变嵌入的 declarator-id 的类型,但它们可以改变复杂声明符的绑定。
我看不出有任何理由将其视为函数调用。特别是考虑到它以int
开头。我可以看到它可能是一个函数指针的声明,直到它看到整数文字。例如,如果是这样的话:
int ( *pf )(int);
这将是pf
类型指针的声明,指向函数返回int
并采用类型为int
的单个参数。