【发布时间】:2019-08-05 08:15:30
【问题描述】:
在C/C++中,我们可以声明/定义一个函数指针类型,然后声明/定义一些这种类型的变量。 但我认为这是模棱两可的。
例如:
typedef void ( *pFunc )();
// typedef void ( aFunc )();
void theFunc() {
cout << "theFunc has been called successfully." << endl;
};
int main() {
pFunc pf0 = theFunc;
pFunc pf1 = &theFunc;
pf0();
( *pf0 )();
pf1();
( *pf1 )();
};
理论上只有pFunc pf1 = &theFunc;和(*pf1)();是合法的,但以上都可以通过编译。
在Pascal syntax中,我们需要分别定义函数的vars或者函数指针的vars,它们的含义是不同的,而且更清晰(至少我是这么认为的)!
此外,我们不能声明/定义函数的 var 来代替函数指针的 var! 我尝试跟随但失败了。
typedef void ( aFunc )();
aFunc af0 = theFunc;
如果使用其他类型,例如 int/double,则有非常严格的语法限制我们正确使用它们。 (如果int*与int不同,为什么*pf0与pf0相同?!)
那么,我可以认为这是 C/C++ 标准的错误吗?
【问题讨论】:
-
没有回答你的问题,但
bug of C/C++ standard是矛盾的。当实现不符合标准时会发生错误。 -
@dyukha - fill entire pages 的那种。自我矛盾、不一致和规范性差。通俗地称它们为 bug 并非没有道理。
-
不是错误,但 OP 认为它不一致/模棱两可是正确的。这些隐式转换非常令人困惑。
-
@Leon:你一直提到“C/C++ 标准”。那是不存在的。有一个 C 标准和一个单独的 C++ 标准。现在,C++ 被设计为与 C在 1990 年存在 兼容,但这仅仅意味着 C++ 可以编译 C 源代码。然而,C++ 有一套完全独特的规则为什么 C 代码在 C++ 中也有效。
标签: c++ function function-pointers typedef