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
źródło
Odpowiedzi:
#include <pch.h>
:Zobacz odpowiedź Gabriela.
include <iostream>
vs#include <iostream>
:To pierwsze jest błędne. To musi być
#include
z#
.using namespace std;
vsusing 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 tylkocout << ...
- 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()
vsint main()
:Nie jest to dozwolone przez Code :: Blocks, ponieważ nie jest to poprawne C ++.
main
powinien 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.
źródło
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? )
źródło
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
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
do
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:
z
Nie wpływa na nic w twoim kodzie, a tylko na używanie
(przy braku
using
) działałoby równie dobrze.źródło
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.using
był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.