【问题标题】:Use of const with typedef-ed type将 const 与 typedef-ed 类型一起使用
【发布时间】:2011-12-05 14:44:15
【问题描述】:

以下代码在大多数编译器上都能正常编译(包括 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;
}

我想说的是:

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

  2. 第二个重要原因是我在调查编译失败的可能原因时,没有找到任何结论性的解释。更糟糕的是,我遇到了这样的建议:“C++ 程序员要避免使用 const”。发帖人接着说,很难弄清楚规范中关于const 在上述场景中的用法的说明,并且这些事情就是为什么 const 作为类型修饰符不在 D 中( - 解释一下)。

  3. 1234563它和移动。是的。我很想听听专家的意见,看看是什么让看起来像正常的代码在 DMC 编译器上失败。谢谢。

【问题讨论】:

  • 流行的编译器?我从未见过在 D 上下文之外使用 DMC。
  • @CatPlusPlus:我通常用 3 个编译器编译 C++ 代码。 MinGW、DMC和微软自带的VS自带的CL。我可能错误地把它们中的任何一个都看得太认真了,以至于它应该如此。您会推荐哪个前 3 名(除了厨房水槽以外的所有东西都没有)? ;) 我知道这是一个完全不同的问题
  • GCC、Clang 和 MSVC。不过,如果您对 C++11 支持很认真,那么请放弃 MSVC。
  • @Cat:如果您认真对待 C++11 语言 支持。图书馆支持完全在那里。甚至最常用的有用 C++11 语言的东西也在那里(auto、lambdas、移动语义)。您缺少可变参数模板和模板别名,但我认为通常不需要这些。一个 MSVC 实现要有用得多。
  • @Xeo:语言支持远比库支持重要。可以从 Boost 中提取库。

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


【解决方案1】:

显而易见的解释是 dmc 中存在错误。错误 消息非常混乱:对于初学者,static 不能出现 函数参数中的任何位置,无论是最外层还是其他。至于类型 限定符,标准很清楚,数组上的类型限定符适用 到数组的各个元素(并且这适用 递归)。按照规范编写,您的函数声明将是:

void f1(String32 const* tokens)

,在应用 typedef 之后,变成:

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

这是完全合法的。

【讨论】:

  • +1 for this " 至于类型限定符,标准很清楚,数组上的类型限定符适用于数组的各个元素(并且递归适用)"
  • @JamesKanze ...如果您认为它等同于void f1(char const (*tokens)[MAXLENGTH32]),这似乎是有道理的。我犹豫是否承认它是一个可能的错误的主要原因是,我在网上遇到的一些与此相关的最早报告的日期是 2003 年。我认为这是一个“错误”的很长一段时间保持不固定——除了它非常难以修复。同时,听起来我需要开始阅读的地方是将类型限定符应用于数组。谢谢
  • @JohnGathogo 所有编译器都有错误。有些人比其他人需要更长的时间才能修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 2012-01-14
  • 1970-01-01
相关资源
最近更新 更多