Почему моя программа успешно компилируется, если я не включаю ? - PullRequest
1 голос
/ 07 августа 2020

Некоторое время меня это озадачивало. Чтобы проверить это, я сделал простую программу, которая просто создает переменную std :: string и выводит ее на экран. Однако он не включает .

#include <iostream>

using namespace std;

int main()
{
        string name = "Test";
        cout << name << endl;
        return 0;
}

Меня смущает то, что эта программа компилируется и работает отлично. Сейчас я использую компилятор clang, поставляемый с инструментами разработчика XCode. Это предполагаемое поведение? Надеюсь, этот вопрос не слишком глуп, поскольку я только начал изучать C ++.

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Причина, по которой вам не нужно включать файл заголовка #include <string.h>, заключается в том, что когда вы включаете файл заголовка #include <iostream>, он включает std::string.

Однако не полагайтесь на него. То, что может работать на вашем компиляторе, может не работать на другом. Всегда включайте правильные файлы заголовков.

Чтобы отредактировать пример, вы должны его использовать следующим образом:

#include <iostream>
#include <string>


int main()
{
        std::string name = "Test";
        std::cout << name << std::endl;
        return 0;
}

Также обратите внимание: почему вы не должны использовать using namespace std;.

0 голосов
/ 07 августа 2020

Почему моя программа успешно компилируется, если я не включаю <string.h>?

Потому что вы не используете какое-либо определение / объявление из <string.h>.

программа компилируется и работает отлично ... Это предполагаемое поведение?

Это случайное поведение.

Нет никаких гарантий, что один стандартный заголовок не будет включать другие стандартные заголовки. Так уж получилось, что <iostream> включил <string> в эту конкретную версию стандартной библиотеки. Поскольку для этого нет гарантии, было бы ошибкой полагаться на такое транзитивное включение.

...