将 const 与 typedef 类型一起使用

问题描述 投票:0回答:1

以下代码在大多数编译器(包括 Microsoft Visual Studio 的 - cl、Minimalist GNU for Windows - MinGW)上编译良好,但在 Digital Mars 编译器 - dmc 上失败,并出现错误:

Error: type qualifiers and static can only appear in outermost array of function parameter

const int MAXLENGTH32 = 32;
typedef char String32[MAXLENGTH32];

void f1(const String32 tokens[]) {

}

int main() {

    return 0;
}

我想声明以下几点:

  1. 我发布这篇文章的第一个原因是为了获得专家的意见,了解为什么代码在流行的编译器上失败(Bjarne Stroustrup 本人推荐它http://www2.research.att.com/~bs/compilers.html) 。主要问题似乎是使用

    const
    与参数。如果删除
    const
    ,代码可以在 DMC 编译器上正常编译。

  2. 第二个重要原因是,在我对编译失败可能的解释进行调查时,并没有找到任何确凿的解释。更糟糕的是,我遇到了这样的建议:“C++ 程序员应该避免使用 const”。发帖者接着说,在上面的场景中,很难弄清楚规范中关于

    const
    用法的说明,这些就是为什么 const 作为类型修饰符不在 D 中的原因( - 解释一下)。

  3. 写这篇文章的最后一个个人原因是,我所学到的关于 C++ 语言的最特殊的事情都是因为没有采取像 it-compiles-on-all-the-rest-so-damn-it-and- 这样的立场继续前行。是的。我渴望听到专家的意见,了解什么可能使看似正常的代码在 DMC 编译器上失败。谢谢。

c++ c++11 constants
1个回答
5
投票

明显的解释是dmc中有一个bug。 错误 消息极其混乱:对于初学者来说,

static
无法出现 函数参数中的任何位置,最外层或其他位置。 至于类型 限定符,标准很明确,数组上的类型限定符适用 到数组的各个元素(并且这适用于 递归地)。 按照规范编写,您的函数声明将是:

void f1(String32 const* tokens)

,应用 typedef 后,变为:

void f1( char const (*tokens)[MAXLLENGTH32] );

这是完全合法的。

© www.soinside.com 2019 - 2024. All rights reserved.