这段代码行末尾的方括号是什么意思?

时间:2017-05-26 18:12:05

标签: c++

我对C ++相当陌生,在浏览参考网站时,我遇到了以下代码片段,从那时起我就一直在努力将其分解。

这是我仍在努力解决的问题:

int (*(*callbacks[5])(void))[3]

我已经阅读了部分C ++帮助书籍,并且(通常)了解优先级流程。但看到许多运营商聚集在一起让我失望,我感到很困惑。我已经看过其他例子和解释(here),但右边的额外[3]下标只会让我感到困惑。

我想知道如何处理这类复杂的代码,即。我应该从哪里开始,我应该遵循什么样的顺序等等。

真的很感激帮助!谢谢!

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的指针