动力G ++,表示当不包括图书馆

问题描述 投票:0回答:2

我是一名计算机专业的学生采取了C ++类现在。

我在Ubuntu开发与VSCode和g ++是我的编译器。

我从我的最后一次分配中扣除,因为我忘了,包括串库点,所以有平地编译错误。

但是,我的机器上,但不包括字符串库,它仍然编译并没有问题或警告运行。

这似乎是G ++抓住这个错误,包括它不告诉我?有没有方法可以让我动力G ++,以表明我忘了字符串库?

这是我经历过这个问题的代码:

#include <iostream>

using namespace std;

int main()
{
    string output = "";
    char inputChar;

    // ask for input while the inputChar is not '0'
    do
    {
        cout << "Enter a character: ";
        cin.get(inputChar);              // get input char from user
        cin.ignore(100, '\n');           // ignore the newline character
        switch( tolower(inputChar) )     // inputChar lowercase for simplified switch statement
        {
            // if inputChar is a vowel, capitalize and append to output string
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'u':
                output += toupper(inputChar);
                break;
            // if char is 0, exit switch without doing anything
            case '0':
                break;
            // all other characters are appended to string in lowercase
            default:
                output += tolower(inputChar);
                break;
        }
    } while (inputChar != '0');

    // print full output string and exit
    cout << "Your string: " << output << endl;


    return 0;
}
c++ compiler-errors g++
2个回答
2
投票

一个#include是仅比文字的文件被包括在内容的剪切和粘贴多个(与宏扩大,和插入的文件/线标记物,从而所述源可以被追踪。)

如果包括的iostream,如果它内部包含字符串,那么你已经及物动词包括字符串。这被认为是不好的,因为谁也不能保证该标准库头将包括其他头,那么你的代码是不可移植的,并且对你使用的标准库的版本小的依赖性。

如果添加包括串到你的代码中,由于对重复的头包裹预处理的保护,它会被如此彻底的抑制,没有证据表明,甚至包括存在将出现在它的输出。编译器无关的工作,而不能可靠地提供你想不误报警告。

例如:假设我们有一个主.cpp文件,和头被称为a.hpp:

头 “a.hpp”:

#pragma once

namespace A {
    void a_function() { }
}

头“b.hpp”

#pragma once
#include "a.hpp"

namespace B {
  void b_function() { }
}

和main.cpp中现在看起来是这样的:

#include "b.hpp" // only include b...

int main() { A::a_function(); } // ... but use something in a.hpp

这将编译但没有警告。经过预处理的输出是这样的:

# 1 "main.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "main.cpp"
# 1 "b.hpp" 1     
# 1 "a.hpp" 1
namespace A {
  void a_function() { }
}
# 3 "b.hpp" 2

namespace B {
    void b_function() { }
}
# 2 "main.cpp" 2

int main() { }

似乎是合理的,而且我们可以看到,被列入由B,并且应该发出一个错误,对吗?

让我们来解决它,然后再试一次:

#include "b.hpp"
#include "a.hpp"

int main() { }

预处理一次:

# 1 "main.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "main.cpp"
# 1 "b.hpp" 1     
# 1 "a.hpp" 1
namespace A {
  void a_function() { }
}
# 3 "b.hpp" 2

namespace B {
    void b_function() { }
}
# 2 "main.cpp" 2

int main() { }

100%相同的前。我们解决了这个问题,但没有在预处理输出任何指示。

除非预处理器提供了更多的信息,在编译器中没有任何变化可以解决您的请求。


0
投票

看来你的年级有一个自定义包括目录,并使用在G ++的-nostdinc-nostdinc++选项,或者他们正在编制在不同的操作系统或不同的编译器的代码。

起初,我认为这是一个缺乏-Wall选项,但似乎在警告类,它实际标记遗漏包括只适用于C或Objective-C的,而不是C ++。您的代码我的系统上编译没有错误两个g ++以及铛++。这并不意味着我的想法之前关于尝试另一个编译器是错误的,只是没用这个问题。

模拟像平地机使用是相当多的工作的环境。但正如我花了一些时间尝试这样做,只是为了合理性检查我最后的答案,我有一个认识:如果通过g++ -E运行您的代码,它会告诉你所有将要编制的有效代码,包括在每一个行参与从何而来。您可以使用它来查看所有包含在你的代码的头文件,以便您可以包括他们所有。

在一方面,这种运动是相当恼人。在另一方面,它几乎没有试图从港口您有没有一个参考平台,一些代码为恼人的,笔者没有作出任何努力,以确保所有的库进行阐述。在紧握的手,从一个非常不同的源系统试图港口一些代码时,该库是不是所有的命名方式完全相同,所以程序员通过这个去不一定会帮 - 尤其是因为编译器约不错抱怨缺少的头文件这个问题,你可以很快查找那些在问题,找出该怎么做,你的系统上的程序或类型的名称。我想到底我倾向于认为你的年级可能是下指令工作从谁认为他们正在帮助塑造学生能够处理他们将遇到未知,而无需太多未知数什么的想法的学术你将有可能遇到的问题。这是令人沮丧和难过,但是生活的时候。我们做我们能做的,我们不这样做,我们不能这样做,但大家可能不知道什么是我们做不到的,直到我们尝试。

© www.soinside.com 2019 - 2024. All rights reserved.