使用带有typedef-ed类型的const

Joh*_*ogo 1 c++ compiler-construction const c++11

以下代码在大多数编译器(包括Microsoft Visual Studio的 - cl,Minimalist GNU for Windows - MinGW)上编译良好,但在Digital Mars Compiler上失败- 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;
}
Run Code Online (Sandbox Code Playgroud)

我想说明以下内容:

  1. 我发布这个的第一个原因是获得专家意见,为什么代码在一个流行的编译器上失败(Bjarne Stroustrup自己推荐它http://www2.research.att.com/~bs/compilers.html).主要问题似乎是使用const参数.如果删除const,代码在DMC编译器上编译正常.

  2. 第二个重要原因是,在我对编译失败的可能解释的调查中,我没有遇到任何确凿的解释.更糟糕的是,我遇到了这样的建议:"C++程序员只是为了避免使用const".海报接着说,很难弄清楚规范const在上述场景中的使用情况,以及这些类型的东西是为什么const,作为类型修饰符,不在D中( - 用来解释有点).

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

Jam*_*nze 5

显而易见的是,dmc中存在一个错误.错误消息非常令人困惑:对于初学者,static不能出现在函数参数中的任何位置,最外层或其他位置.对于类型限定符,标准清楚地表明数组上的类型限定符适用于数组的各个元素(并且这适用于递归).按规范编写,您的函数声明将是:

void f1(String32 const* tokens)
Run Code Online (Sandbox Code Playgroud)

,在应用typedef之后,变为:

void f1( char const (*tokens)[MAXLLENGTH32] );
Run Code Online (Sandbox Code Playgroud)

这是完全合法的.