【问题标题】:why does C++ forbid the declaration of a parameter with no type?为什么 C++ 禁止声明没有类型的参数?
【发布时间】:2012-02-17 05:23:47
【问题描述】:

我希望将以下方法作为任何数组的通用方法,

int arrayLength(`anyType` array[])
{
    return sizeof(array) / sizeof(array[0]);
}

然而,C++ 似乎根本不允许类型有任何歧义,

为什么会这样,我应该如何解决它?

【问题讨论】:

  • template<typename T, std::size_t N> std::size_t arrayLength(T (&)[N]) { return N; }
  • 另一个相关主题:stackoverflow.com/questions/95500/…
  • @ilgjarn 你能不能完整地向我解释你的代码,即把它拼出来,就像我是一个完全的傻瓜一样,因为我真的很想了解它所做的一切, 谢谢
  • @Sebastian :在我看来,您链接到的答案中已经详细解释了。

标签: c++ arrays types ambiguity


【解决方案1】:

我认为您真正要问的是“为什么 C++ 坚持静态类型?”

答案是:因为如果语言使用静态类型,编写生成小型、快速程序的编译器会更容易。这就是 C++ 的目的:创建小型、快速的程序,如果用 C 编写,其复杂性将相对难以管理。

当我说“小”时,我指的是任何所需运行时库的大小。

【讨论】:

    【解决方案2】:

    在 Visual C++ 中,有一个 __countof() 结构可以做同样的事情。它被实现为 C++ 编译的模板和 C 的宏。如果在指针(而不是真正的数组)上使用 C++ 版本会出错,而 C 版本不会。

    【讨论】:

      【解决方案3】:

      因为类型必须被压入堆栈然后弹出,并且sizeof 一种类型不等于sizeof 另一种类型。

      如果函数之间在堆栈上传递的类型的大小不是固定的或事先不知道的,编译器如何编译函数?

      这个问题的解决方案——正如其他人所指出的——是模板和宏,它们都动态生成代码——然后依次编译——在编译时,显示为“解决”问题,但实际上只是通过将工作卸载到编译器上来避免或分散你的注意力。

      【讨论】:

        猜你喜欢
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-31
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多