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


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.


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? )


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.