代码在 ideone 中编译,但不使用 gcc

Posted

技术标签:

【中文标题】代码在 ideone 中编译,但不使用 gcc【英文标题】:Code compiles in ideone but not with 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 没有办法在缺少 ; 的情况下生成错误消息。 【参考方案1】:

这里少了一个分号:

 int v()
        ^

应该是:

 int v() ;

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

 int v(0) ;

或在C++11中:

 int v0 ; 

【讨论】:

这里只是一个错字;他的链接代码包括分号。 @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,显然它受到看起来像函数声明的行的影响。

【讨论】:

以上是关于代码在 ideone 中编译,但不使用 gcc的主要内容,如果未能解决你的问题,请参考以下文章

GCC的几个重要选项解释

我下载的codeblocks也提示找不到可执行的编译器,我后来自己下了一个gcc,但不知道如何设置。

使用 GCC/G++/AS 在固定大小的内存边界上对齐本机代码?

找出确切的 gcc 隐式选项

vs怎么使用是gcc代码怎么写?

如何关闭 gcc 编译器优化以启用缓冲区溢出