使用带有typedef-ed类型的const

时间:2011-12-05 14:44:16

标签: c++ compiler-construction const c++11

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

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

我想说明以下内容:

  1. 我发布这个的第一个原因是为了获得关于代码在一个流行的编译器上失败的原因的专家意见(Bjarne Stroustrup自己推荐它http://www2.research.att.com/~bs/compilers.html)。主要问题似乎是使用const int MAXLENGTH32 = 32; typedef char String32[MAXLENGTH32]; void f1(const String32 tokens[]) { } int main() { return 0; } 参数。如果您删除const,则代码会在 DMC 编译器上正常编译。

  2. 第二个重要原因是,在我对编译失败的可能解释进行调查时,我没有得到任何结论性的解释。更糟糕的是,我遇到了这样的建议:“C ++程序员只是为了避免使用const”。海报接着说,在上面的场景中,很难弄清楚规范中关于const的用法的内容,以及这些类型的东西是作为类型修饰符的const不在的原因D( - 用来解释)。

  3. 这篇文章的最后一个个人原因是,我学到的关于C ++语言的大多数特殊事情都是出于不采取像这样的立场 - 编译 - 所有 - 其余 - 所以 - 该死的 - 它和移动上。是。我很想听听专家的意见,看看正常代码看起来像普通代码那样在 DMC 编译器上失败了。感谢。

1 个答案:

答案 0 :(得分:5)

明显的探索是dmc中存在一个错误。错误 消息非常令人困惑:对于初学者,static无法显示 函数参数中的任何位置,最外层或其他。至于类型 限定符,标准清楚表明数组上的类型限定符适用 到数组的各个元素(这适用 递归)。按规范编写,您的函数声明将是:

void f1(String32 const* tokens)

,在应用typedef之后,变为:

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

这是完全合法的。