【问题标题】:What do the square brackets at the end of this code line mean?此代码行末尾的方括号是什么意思?
【发布时间】:2017-10-27 17:10:34
【问题描述】:

我对 C++ 还很陌生,在浏览参考网站时,我遇到了以下代码 sn-p,从那以后我一直在努力破解它。

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

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

我已经阅读了我的 C++ 帮助书籍的一部分,并且(通常)理解了优先流。但是看到许多操作员聚集在一起让我很反感,我很困惑。我看过其他例子和解释(here),但是右边额外的 [3] 下标对我来说只是让事情变得复杂。

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

非常感谢您的帮助!谢谢!!

【问题讨论】:

  • fwiw 我已经用 C++ 编写了很长时间了,如果我看到它,我会起床再去喝杯咖啡,然后再尝试弄清楚它
  • 你可以试试this
  • @CoryKramer,或者直接使用cdecl.org

标签: c++


【解决方案1】:

这是一个由 5 个指向不带参数的函数的指针组成的数组,并返回一个指向 3 个整数数组的指针。

我只是想通了,因为cdecl.org 告诉了我。这是 typedef 可以使事情更容易阅读的地方之一:

typedef int (*PointerToArrayOfInts)[3];
typedef PointerToArrayOfInts (*FunctionReturningPointerToArray)(void);
FunctionReturningPointerToArray callbacks[5];

【讨论】:

  • 没有使用“取消引用”这个词? ;)
【解决方案2】:

这是一个原始的内省“漂亮打印机”的开始,它可以让 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)))

【讨论】:

  • 这是一个很棒的想法,为什么以前没有人想到这个?
  • 用“reference to”、“const”、“volatile”扩展它也很容易;并且通过一些额外的工作,扩展以打印通用函数类型的参数类型也不应该太难。在这种特殊情况下,我只是碰巧不需要这些。
  • 妈的,太好了。
  • 我喜欢这样 - 几乎就像处理 C++ 类型的cdecl
【解决方案3】:
int (*(*callbacks[5])(void))[3]

将回调声明为函数指针数组 5 (void) 返回指向 int 数组 3 的指针

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2012-02-29
    • 2017-02-08
    相关资源
    最近更新 更多