无法使用gcc编译C++

13

我需要在我的Linux系统上编译代码。这是简单的代码,但我不知道哪里出了问题:

我有这段代码,但无法编译:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string char1, char2, char3, char4, char5, char6;
    cout<<"Hello this is your standard True and False quiz"<<endl;
    cout<<"Please enter 'T' or 'F'"<<endl;
    cout<<"No#1 George Washington invented the toilet?"<<endl;
    cin>>char1;
    if ( char1 != "T" || "F")
    {
        cout<<"You entered an incorrect character please reenter True of False"<<endl;
        cin>>char1;
    }
    if ( char1 != "T" || "F")
    {
        cout<<"You entered an incorrect character please reenter True of False"<<endl;
        cin>>char1;
    }
    if ( char1 == "T" )
    {
        cout<<"You entered the incorrect answer. The answer is False"<<endl;
    }
    cout<<"No#2 The Squareroot of 3136 is 56?"<<endl;      
    cin>>char2;
    if ( char2 != "T" || "F")
    {
        cout<<"You entered an incorrect character please reenter True of False"<<endl;
        cin>>char2;
    }
    if ( char2 != "T" || "F")
    {
        cout<<"You entered an incorrect character please reenter True of False"<<endl;
        cin>>char2;
    }
    if ( char2 == "F" )
    {
        cout<<"You entered the incorrect answer. The answer is True"<<endl;
    }
    cout<<"No#3 
    system("PAUSE");
    return 0;
} 

当我试图编译它时:

gcc file.c

I get:

test.c:1: fatal error: iostream: No such file or directory
compilation terminated.

据我所知,我已经拥有了所有需要的库,我做错了什么吗?

10
摆脱 system("PAUSE"); - David Schwartz
3
@dreamlax: 这个语句一般只在程序结尾使用,很可能是为了让其他人在他们的集成开发环境中单击“运行”按钮后可以看到结果。不要表现得像这是最可怕的事情,因为它不是。至于它的作用,我宁愿看到一个 system("PAUSE") 而不是一个执行完全相同操作的 C++ 函数,因为这两种方法都不会在真正的(非学校、非学习)程序中使用--如果有人花时间编写“按任意键”代码,那么这就是他们没有用来解决实际问题的时间。 - cHao
1
@cHao:我知道我对此有些过于激动,但这只是因为我认识一个以教授C++为职业的人,他鼓励使用system("pause")(以及其他不太可移植/实现定义的东西),并且没有更重要的原则,比如RAII。当我看到system("pause")时,我立刻想起这个人,我很生气他仍然有工作,许多人从他那里学习了糟糕的编码实践。system("pause")只是这个家伙的冰山一角。再加上过多的全局变量,void main()... - dreamlax
1
过度依赖于实现定义的行为,你就会得到这个家伙。发抖 - dreamlax
1
@cHao:是的,你说得很对,他一定在教授某些正确的东西...而且实现定义行为确实有其存在的意义,但我感觉他没有强调不同系统可能会以相同的代码表现出不同的行为。人们完成这个家伙的课程后会认为他们知道C++,但实际上他们只了解Windows下的C++(如果你明白我的意思的话)。每次看到system("pause"),我肯定需要喘口气,回想起来,为此激动真是太傻了... :) - dreamlax
显示剩余9条评论
3个回答

35
你正在使用C编译器编译C++代码。请尝试使用进行编译。
此外,最好将文件命名为file.cpp - 将其命名为.c不会阻止它进行编译,但它会帮助像make这样的工具。此外,它会帮助以后遇到你的源代码的其他人(包括你自己)。
编辑:你的代码还有一些与你的问题无关的问题,但只要你让它编译就会遇到这些问题:
  1. 你的(char1 != "T" || "F")应该是(char1 != "T" && char1 != "F")(请注意使用&&而不是||
  2. 当你得到错误输入时,你正在读取另一个字符,但由于你的代码没有循环,程序将在执行任何操作之前退出。
  3. 正如David Schwartz所指出的那样,值得删除system("PAUSE")
这些是新手在C中常见的错误(欢迎!我建议从一些教程或介绍性书籍开始。这里有一个优秀的C书籍和教程列表)。
如果你遇到任何无法自行解决的问题,请随时开一个新问题。

2
我其实很惊讶地发现 g++ file.cfile.c 视为 C++ 代码而不是 C 代码。我想这是有道理的,但并不明显。最好的建议是同时使用 g++ 并使用正确的语言后缀(通常为 .cpp,但也可能是其他后缀)。 - Keith Thompson

6

这是C++代码,而不是C代码,必须根据相应的编译方式进行编译。(它也有许多逻辑错误,但我们可以稍后担心这个问题。)


6

您有一段C++代码:

#include <iostream>
#include <string>
using namespace std;
/* ... */

但是正在尝试将其编译,就像它是C语言一样:

gcc file.c

C++不是C语言,您不应该将它视为同一种语言。

尝试将您的文件重命名为file.cpp,并使用g++代替gcc

g++ file.cpp

文件重命名并不是必须的,但更改后的名称可以让你更有效地使用make - sarnold
1
有些编译器根据文件扩展名来选择如何解释文件(如果没有明确指定文件使用的语言)。 Translated text: - dreamlax
那似乎是一个完全合理的优化。 :) - sarnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接