我对C ++相当陌生,在浏览参考网站时,我遇到了以下代码片段,从那时起我就一直在努力将其分解。
这是我仍在努力解决的问题:
int (*(*callbacks[5])(void))[3]
我已经阅读了部分C ++帮助书籍,并且(通常)了解优先级流程。但看到许多运营商聚集在一起让我失望,我感到很困惑。我已经看过其他例子和解释(here),但右边的额外[3]下标只会让我感到困惑。
我想知道如何处理这类复杂的代码,即。我应该从哪里开始,我应该遵循什么样的顺序等等。
真的很感激帮助!谢谢!
答案 0 :(得分:10)
这是一个包含5个函数指针的数组,这些函数不带参数,并返回指向3个int数组的指针。
我只是想出来因为cdecl.org告诉我。这是一个typedef使事情更容易阅读的地方之一:
typedef int (*PointerToArrayOfInts)[3];
typedef PointerToArrayOfInts (*FunctionReturningPointerToArray)(void);
FunctionReturningPointerToArray callbacks[5];
答案 1 :(得分:7)
这是一个原始的内省“漂亮的打印机”的开始,它让C ++编译器本身为你解决问题:
#include <iostream>
template <typename T>
struct introspect;
template <>
struct introspect<int> {
static std::ostream& prettyPrint(std::ostream& os) { return os << "int"; }
};
template <typename T>
struct introspect<T*> {
static std::ostream& prettyPrint(std::ostream& os) {
os << "pointer to ";
return introspect<T>::prettyPrint(os);
}
};
template <typename T, std::size_t N>
struct introspect<T[N]> {
static std::ostream& prettyPrint(std::ostream& os) {
os << "array of " << N << " (";
introspect<T>::prettyPrint(os);
return os << ")";
}
};
template <typename Res>
struct introspect<Res(void)> {
static std::ostream& prettyPrint(std::ostream& os ) {
os << "function returning (";
introspect<Res>::prettyPrint(os);
return os << ")";
}
};
int main() {
int (*(*callbacks[5])(void))[3];
introspect<decltype(callbacks)>::prettyPrint(std::cout) << '\n';
return 0;
}
输出:
array of 5 (pointer to function returning (pointer to array of 3 (int)))
答案 2 :(得分:1)
int (*(*callbacks[5])(void))[3]
将回调声明为指向函数的指针的数组5(void)返回指向int的数组3的指针