Robię kurs, ale rzeczy, o których mówi wykładowca, nie działają

3

Niedawno zająłem się programowaniem i postanowiłem nauczyć się C ++. Skorzystałem ze sprzedaży w Udemy i kupiłem tam trzy kursy, jeden dla początkujących w C ++, jeden do tworzenia gier i jeden dla Blendera.

Zacząłem robić kurs dla początkujących, wykładowca powiedział, że użyje Code :: Blocks, ale każde inne IDE będzie w porządku, więc pobrałem Visual Studio 2017, ponieważ tego właśnie używał kurs tworzenia gier. Ale kiedy robię dokładnie tak, jak mówi wykładowca (i pisze), kod nie kompiluje się poprawnie.

Oto przykład:

Co napisał wykładowca i zaczął pracować na swoim komputerze

#include <iostream> 

using namespace std;

main()
{
    cout << "Hello world! :-)";

}

To, co wymyśliłem, zadziała po pewnym googlowaniu

#include <pch.h>
#include <iostream>
using std::cout;

int main()
{
    cout << "Hello world! :-)";
}

Moje pytanie do doświadczonych osób brzmi: jaka jest różnica między Code :: Blocks a Visual Studio 2017? Czym różni się w tym przypadku? Czy będę w stanie skorzystać z tego kursu do nauki?

Z góry dziękuję!

edycja: edytowane w brakującym # w kodzie wykładowcy

Wilmer Jonsson
źródło
Twój profesor napisał kod C ++, używając Visual Studio i składni, tak naprawdę napisałeś kod Visual C ++. Używasz zupełnie innego kompilatora niż twój profesor. Powinienem skonfigurować Visual Studio, aby korzystało z tego samego kompilatora C ++, muszę zaznaczyć, Visual Studio obsługuje kilka różnych wersji standardu C ++, więc absolutnie powinien działać z pierwszym blokiem kodu. Jednak pytania, które dotyczą tego, czy będziesz mógł skorzystać z tego kursu, nie są w naszym zakresie. To nie jest coś, na co każdy może odpowiedzieć w dowolnej społeczności Stack Exchange, a już na pewno nie tutaj w Super User.
Security Hound
Jeśli chcesz napisać zwykłą aplikację konsolową w VS2017, użyj Utwórz nowy projekt -> Visual C ++ -> Pulpit systemu Windows -> Windows Desktop Wizzard, a następnie upewnij się, że jest napisane Aplikacja konsoli w typie aplikacji i odznacz Prekompilowane nagłówki i Cykl rozwoju bezpieczeństwa i wykonaj sprawdź pusty projekt.
NathanOliver
3
@ FrançoisAndrieux: Zadeklarowanie funkcji bez typu zwracanego nigdy nie było poprawnym C ++, ale jest poprawne C89.
Ty
1
Normalnie używałbym „” dla nagłówków w rozwiązaniu lub projekcie i <> dla nagłówków systemowych lub zewnętrznych, więc #include <pch.h> byłoby #include „pch.h”. Powiedziawszy to, tak czy inaczej będzie działać w VS.
drescherjm

Odpowiedzi:

4
  • #include <pch.h>:
    Zobacz odpowiedź Gabriela.

  • include <iostream>vs #include <iostream>:
    To pierwsze jest błędne. To musi być #includez #.

  • using namespace std;vs using std::cout;:
    Chociaż żadna z nich nie jest szczególnie dobrą praktyką, obie powinny zrobić to samo. Jeśli nie napiszesz żadnego z nich, będziesz musiał pisać std::cout << ...zamiast tylko cout << ...- to wydaje się denerwujące, ale należy się do tego przyzwyczaić, jeśli chcesz zostać poważnym programistą C ++. Zobacz także Dlaczego „używanie przestrzeni nazw std” jest uważane za złą praktykę? .

  • main()vs int main():
    Nie jest to dozwolone przez Code :: Blocks, ponieważ nie jest to poprawne C ++. mainpowinien zawsze wracać int.

Ogólnie wydaje się, że już na tym podstawowym przykładzie trafiłeś na niefortunną liczbę różnic między środowiskami / kompilatorami. Jednak do tej pory ani twój kurs, ani VS2017 nie były błędne, dlatego zalecamy ich używanie. Jeśli coś, co pisze wykładowca, nie będzie działać w innym środowisku, prawdopodobnie złym pomysłem jest napisanie tego rodzaju kodu w pierwszej kolejności. W tym prostym przykładzie popełnili kilka błędów.

PS: Zdecydowanie zalecam włączenie ostrzeżeń, ponieważ mogą one powiedzieć ci, kiedy zrobisz coś źle w bardziej subtelny sposób. Istnieje wiele błędów (typu „strzelanie sobie w stopę”), których nie wymaga kompilator, aby cię powstrzymać, ale jeśli poprosisz o zatrzymanie (słuchając ostrzeżeń), to ci pomoże.

Max Langhof
źródło
3

Korzystanie z programu Visual Studio powinno być w porządku, o ile wyłączysz prekompilowane nagłówki, a samouczek używa kodu zgodnego ze standardem.

Informacje o wstępnie skompilowanych nagłówkach:

Program Visual Studio domyślnie włącza wstępnie skompilowane nagłówki w programie wiersza polecenia C ++. Oznacza to, że w twoim projekcie domyślnie wymusi to użycie prekompilowanego nagłówka w pierwszym wierszu kodu źródłowego (pch.h tutaj). Wyłączając je, możesz prawie * sprawić, że pierwszy fragment będzie działał w VS. Aby to zrobić, wybierz projekt, przejdź do menu „Projekt-> Właściwości”, a następnie do sekcji „Właściwości konfiguracji -> C / C ++ -> Prekompilowane nagłówki”, a następnie zmień ustawienie „Prekompilowany nagłówek” na „Nieużywany prekompilowany Opcja „Nagłówki” (dotyczy to VS 2012, zastosowanie tego do innych wersji VS powinno być łatwe).

Jeśli chcesz tego uniknąć w przyszłości, możesz utworzyć pusty projekt podczas konfigurowania projektu w VS.

Zobacz także: http://msdn.microsoft.com/en-us/library/h9x39eaw%28v=vs.71%29.aspx , Jak uniknąć prekompilowanych nagłówków

*: Pierwszy fragment nie zadziała, ponieważ deklaracja main nie jest poprawna C ++, tylko C (patrz https://en.cppreference.com/w/cpp/language/main_function , Jaka jest prawidłowa deklaracja main? )

Gabriel Ravier
źródło
3

Jeśli chodzi o twoje pytanie, VS będzie w porządku na twoim kursie, chociaż nadal jestem zaskoczony oryginalną wersją tego kodu prowadzącego.

Jednak naprawdę warto poświęcić trochę czasu na zrozumienie, co zrobiły wszystkie Twoje zmiany i dlaczego rozwiązały Twój problem. Być może już to zrobiłeś - to nie wrażenie, jakie wywarło na mnie zdanie

To, co wymyśliłem, zadziała po pewnym googlowaniu

  • gdy pojawi się błąd kompilacji lub ostrzeżenie, przeczytaj go i spróbuj go zrozumieć.
  • jeśli nie rozumiesz błędu - i jest to normalne, z pewnością podczas nauki - włamanie się do kodu, dopóki nie zadziała, jest całkowicie w porządku. Przynajmniej czasami jest to szybsze, a wiedza, że ​​zrobiłeś postęp, jest własną nagrodą.
  • jeśli włamanie się do kodu przy użyciu Internetu nie jest możliwe, musisz po prostu przestudiować komunikat o błędzie. Włączenie wszystkich błędów i ostrzeżeń kompilatora oraz wypróbowanie wielu kompilatorów może pomóc - nawet jeśli wszystkie zawiodą, komunikaty mogą być bardziej przydatne. (Często uważam, że clang ma przydatne błędy, a godbolt.org jest bardzo pomocny).
  • jeśli włamanie się do kodu nie rozwiąże problemu, powinieneś spróbować zrozumieć, dlaczego . Teraz możesz zobaczyć, co zmieniłeś, spojrzeć na pierwotny błąd i spróbować zrozumieć, dlaczego zmiany go naprawiły. Jeśli wprowadziłeś wiele zmian, czy wszystkie były naprawdę konieczne? Czy rozumiesz, co oni wszyscy zrobili i dlaczego?

    Jeśli to zrobisz, możesz szybciej rozwiązać następny powiązany problem , zamiast ponownie przechodzić przez cały proces prób i błędów. Możesz nawet napisać lepszy kod, który pozwoli uniknąć problemu.

    Jest to część, która faktycznie stanowi uczenie się i dlatego staram się to rozwiązać.


Ważną poprawką była zmiana linii

include <iostream>

main()

do

#include <iostream>

int main()

ponieważ te pierwsze nie są legalne w C ++. Jeśli twój wykładowca naprawdę napisał dokładnie to, a ty jakoś nie pomyliłeś się, to nie mam pojęcia, dlaczego ich przykład zadziałał.

Rzeczy specyficzne dla Visual Studio to prekompilowany nagłówek, jak opisano w odpowiedzi Gabriela.

Ale pozostała zmiana jest zasadniczo kosmetyczna. Zastępowanie:

using namespace std;

z

using std::cout;

Nie wpływa na nic w twoim kodzie, a tylko na używanie

  std::cout << "Hello world! :-)";

(przy braku using) działałoby równie dobrze.

Nieprzydatny
źródło
Można bezpiecznie założyć, że były to coś więcej niż „przypadkowe permutacje kodu”. Tak naprawdę, założę się, że jeden z komunikatów o błędach ( use of undeclared identifier 'cout'), który w pewnym momencie był googlowany, doprowadził do odpowiedzi w stylu „zapomniałeś using std::cout”. Uważam, że ostatni akapit jest niepotrzebnie protekcjonalny, zwłaszcza biorąc pod uwagę, jak udało im się naprawić wszystkie te błędy za pomocą tylko jednej przypadkowej zmiany.
Max Langhof,
Problem, jeśli wprowadzasz przypadkowe zmiany, oznacza to, że nie wiesz, które zmiany były ważne, co oznacza, że ​​nie wiesz, dlaczego zadziałały lub jak uniknąć problemu w przyszłości.
Bezużyteczne
Kluczową kwestią nie jest to, że nigdy nie powinieneś hakować czegoś, dopóki to nie zadziała - nie możesz nauczyć się ani utrzymać motywacji w próżni - ale musisz nauczyć się czytać komunikat o błędzie, a kiedy twój kod w końcu zadziała, bardzo przydatne jest usiąść i zrozumieć, dlaczego .
Bezużyteczne
To wszystko prawda, ale obecnie wnioskujesz, że pytający nic z tego nie zrobił, po prostu dlatego, że nie cofnął tej jednej zmiany. Prawdopodobnie zdawali sobie sprawę, że oba usingbyły równoważne w procesie kompilacji kodu (ponieważ zmiana nie zmieniła komunikatu o błędzie), w którym to momencie łatwiej jest zostawić go tam, niż go cofnąć - i dlaczego miałbyś marnować wysiłek, jeśli masz jeszcze 3 inne wiadomości kompilatora, o które musisz się martwić? Nie wydaje mi się, aby zbesztanie (tak mi się wydaje, jako niepowiązana trzecia część) jest tutaj właściwe.
Max Langhof,
Możliwie! Być może czytam zbyt wiele w to, co wymyśliłem, że zadziała po pewnym googlowaniu , ale tak do mnie przychodzi. Pytanie to nie sugeruje żadnego szczególnego zrozumienia, co oznaczają zmiany. W każdym razie nie ma to na celu karcenia, ale wzmocnienie nawyku prób zrozumienia.
Bezużyteczne