Когда включать заголовок <string>в вашу программу? - PullRequest
0 голосов
/ 01 марта 2019

Включаете ли вы заголовок «string», когда библиотека, такая как «iostream», уже предоставляет решение?

Пример. Включаете ли вы библиотеку строк, если вы уже включили библиотеку iostream?Какой правильный профессиональный метод?

#include <iostream>
#include <fstream>

using namespace std;
int main() {
    ifstream fin;
    fin.open("input.txt");
    string data;
    fin >> data;
    cout << data << endl; // Works with <iostream>, and without <string>
    fin.close();
    return 0;
}

Пример 2: Использовать библиотеку строк, если другая библиотека обеспечивает функциональность, даже если программа компилируется без строки?

#include <iostream>
#include <string>
#include <fstream>

using namespace std;
int main() {
    ifstream fin;
    fin.open("input.txt");
    string data;
    fin >> data;       
    cout << data << endl; // Even though <iostream> allowed program to compile, we include the <string> library.
    fin.close();
    return 0;
}

Полученные баллы за мое задание по программированию класса CSC 101, потому что, хотя программа работала, учитель сказал, что при использовании строкового типа данных мне нужно было включить строковую библиотеку.Хотя технически это было нормально без этого возможно. Вот вопрос.

1 Ответ

0 голосов
/ 01 марта 2019

Ваш учитель был прав.

Ваша программа работала без <string> случайно .Ваша стандартная реализация библиотеки этой версии на этой платформе в этих обстоятельствах в тот день транзитивно включала то, что вам было нужно, через <iostream>.Стандартная библиотека - это просто код, подобный вашей, и так уж получилось, что ваша конкретная реализация содержит внутри <iostream> #include <string>.Он мог быть похоронен за многими другими #include, но в конце концов попал туда.Но это честно чистый шанс, и это не значит, что это то, что язык гарантирует, или то, что должно быть всегда, даже на практике.

Вы всегда должны кодировать в соответствии со стандартами.

Если вы используете функции из <string>, включите <string>.

Только сегодня я пытался построить свой большой проект с новой цепочкой инструментов и нашелНесколько мест, где я случайно использовал транзитивные включения, и в результате это сломало сборку, потому что новая реализация стандартной библиотеки имела немного другое расположение заголовков.Я покорно добавил недостающие #include s, и теперь мир стал для этого лучшим местом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...