【问题标题】:Code compiles in ideone but not with gcc代码在 ideone 中编译,但不使用 gcc
【发布时间】:2013-11-11 05:18:29
【问题描述】:

我写了以下代码:

#include <iostream>
using namespace std;

int main()
{
    int v()
    return 0;
}

我在ideone中运行,编译成功。我的计算机上的文件test1.cpp 中有相同的代码,我运行g++ test1.cpp 并收到以下错误:

./test1.cpp: In function ‘int main()’:
./test1.cpp:7:2: error: a function-definition is not allowed here before ‘return’

为什么会发生这种情况?这是一个错误吗? 我正在使用 linux mint,gcc 版本 4.7。

【问题讨论】:

  • 现在在您的实际代码中添加相同的分号并重新编译
  • 你是怎么编译这个的?你的实际编译命令是什么?
  • *打脸。好的,试试 g++-4.8 test1.cpp
  • @BryanChen 我不认为它是一种类型,请参阅here 生成相同的错误消息,如果没有分号,如果你分叉并删除它,ideoone 也会产生相同的错误。
  • @BryanChen 我正在回滚 b/c 没有办法在缺少 ; 的情况下生成错误消息。

标签: c++ syntax-error


【解决方案1】:

这里少了一个分号:

 int v()
        ^

应该是:

 int v() ;

这是一个函数声明,但不清楚这是什么意思。如果你想初始化v,那么下面的方法会起作用:

 int v(0) ;

或在C++11中:

 int v{0} ; 

【讨论】:

  • 这里只是一个错字;他的链接代码包括分号。
  • @ErnestFriedman-Hill 请参阅here 生成与描述相同的错误消息,但如果添加 ;,则错误消息会消失。所以它看起来根本不像一个错字。
  • @ErnestFriedman-Hill 他的链接代码无关紧要,它是编译器。这是正确的答案。
【解决方案2】:

这通常被称为 C++ 中最令人头疼的解析。当你做类似的事情时

int f();

编译器将其读取为函数原型,声明一个函数f,它返回一个int。如果您使用的是 C++11,则应改为使用

int f{}; // f initialized to 0

如果您不使用 C++11,请确保立即初始化变量。

【讨论】:

  • 这不会导致编译失败。在main() 中声明一个函数是完全可以的。
【解决方案3】:

你忘记了后面的分号

int v();

【讨论】:

    【解决方案4】:

    在您使用 4.7 时,Ideone 正在为您的代码使用 gcc 4.8.1(您可以在自己的链接中看到)

    关于 C++ 11 实现有 several difference,显然它受到看起来像函数声明的行的影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-24
      • 2020-03-26
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      相关资源
      最近更新 更多