【问题标题】:Why const keyword without identifier in function parameter compiles?为什么编译函数参数中没有标识符的 const 关键字?
【发布时间】:2017-05-03 10:05:07
【问题描述】:

在使用 C++ 语法时,我编写了一些我认为无法编译的代码。

以下代码被简化以隔离问题:

void foo(const) {} //why doesn't the compiler flag this line as error?
int main() {}

我在 MinGW 的 g++ 编译器上为 C++ 编译了上述源代码,它没有任何警告或错误。

出于好奇,我想知道为什么在函数参数中没有以下标识符的情况下允许使用 const 是否有任何意图。

或者这可能是一个错误?

编辑:看看this,亲眼见证其中的奥秘。

【问题讨论】:

  • 我在 Ideone.com 上执行此操作时收到“错误:ISO C++ 禁止声明没有类型 [-fpermissive] 的‘参数’”。也许你在某个地方设置了那个标志。
  • 刚在 Ubuntu 17.04 上用 G++ 试过,和 InternetAussie 报告的错误一样,这是不允许的。
  • 你们俩都用什么版本的g++?您是否添加了任何其他编译器命令?
  • @Christian 我刚刚关闭了我的笔记本电脑,我现在在 PC 上,我使用的是 Ubuntu 17.04 附带的默认版本的 g++,尝试用谷歌搜索它。编译器没有额外的参数,只是一个默认编译:g++ programname.cpp
  • @FairPlay 我刚刚在网上测试了它,它确实给出了一个错误。这很奇怪,我使用的是 g++ 6.3.0(在其当前版本旁边),但它可以编译。猜猜我的好奇心到此为止了。

标签: c++ gcc mingw


【解决方案1】:

您可能正在运行编译器而没有启用有用的警告。许多编译器只发出标准要求的诊断信息,除非您特别要求更多:

g++ -std=c++17 -fPIC -g -Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds -Weffc++     -c -o 16019202.o 16019202.cpp
16019202.cpp:1:10: error: ISO C++ forbids declaration of ‘parameter’ with no type [-fpermissive]
 void foo(const) {} //why doesn't the compiler flag this line as error?
          ^~~~~

(在 Debian 上使用 GCC 6.3.0)。

【讨论】:

  • 但是不给编译器增加额外的参数,你机器上的编译器是不是也跳过了第1行的错误?
  • @Christian - 我禁用了非默认警告,似乎 GCC 6.3 默认情况下确实报告了错误。但这不是必需的,因此完全可以保持安静(我猜你的编译器是安静的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
相关资源
最近更新 更多