1
resposta

O Programa funciona sem a inclusão das bibliotecas ctime e cstdlib

https://cursos.alura.com.br/course/cpp-introducao-a-linguagem/task/45933

No vídeo da aula 4, minutos 4:19, do curso C++: Introdução a linguagem e a STL é adicionado a biblioteca ctime ao header do arquivo. Eu gostaria de entender por que eu consigo executar o mesmo programa da aula sem usar as bibliotecas ctime e cstdlib.

Eu estou no Visual Studio 2019 Community em uma aplicação de console.

#include <iostream>
using namespace std;

int main()
{
    cout << "***********" << endl;
    cout << "** GUESS **" << endl;
    cout << "***********" << endl;

    bool playerChoosePlayAgain = true;

    while (playerChoosePlayAgain) {

        srand(time(NULL));
        int secretNumber = rand() % 3 + 1;

        int guess;
        bool correctGuessDecision = false;

        cout << "Estou pensando em uma número de 1 e 3. Algum palpite?" << endl;

        while (!correctGuessDecision) {

            cin >> guess;

            correctGuessDecision = guess >= 1 || guess <= 3;
            if (!correctGuessDecision) {
                cout << "O número " << guess << " não é válido! Escolha um numero de 1 e 3:" << endl;
            }
        }

        if (secretNumber == guess) {
            cout << "Parabéns! Você acertou o número." << endl;
        }
        else {
            cout << "hm, que pena! O número era " << secretNumber << '.' << endl;
        }


        bool correctPlayAgainDecision = false;
        char playAgainDecision;

        while (!correctPlayAgainDecision) {

            cout << "Você gostaria de tentar novamente? [s/n]" << endl;
            cin >> playAgainDecision;

            correctPlayAgainDecision = playAgainDecision == 's' || playAgainDecision == 'n';
            if (correctPlayAgainDecision) {
                playerChoosePlayAgain = playAgainDecision == 's';
            }
        }

    }

    cout << "Obrigado por jogar!" << endl;
}
1 resposta

Oi Allan,

Quando você escreve #include<iostream>o compilador (ou pra ser mais preciso, o pré-processador) literalmente copia e cola um arquivo chamado iostream no seu código. Esse arquivo também tem alguns #include, que são expandidos da mesma forma.

O que provavelmente acontece é que quando você inclui iostream, você acaba incluindo os arquivos ctime e cstdlib indiretamente.

No terminal, podemos ver essa cadeia usando a opção -H:

$ gcc -H a.cpp
. /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iostream
.. /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config
.. /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ios
... /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config
... /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iosfwd
.... /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config
[...]

Acredito que no Visual Studio você também pode ver essa cadeia em:

Project Settings -> Configuration Properties -> C/C++ -> Advanced -> Show Includes