W tej sekcji zajmiemy się niektórymi typowymi problemami, na które nowi programiści wydają się napotykać z dość dużym prawdopodobieństwem. Nie ma to być wyczerpująca lista problemów z kompilacją lub wykonaniem, ale raczej pragmatyczna lista rozwiązań bardzo podstawowych problemów. Jeśli masz jakieś sugestie dotyczące innych problemów, które można dodać do tej listy, opublikuj je w sekcji komentarzy poniżej.
Ogólne problemy w czasie wykonywania
P: Podczas wykonywania programu okno konsoli miga, a następnie natychmiast się zamyka.
Najpierw dodaj lub upewnij się, że następujące wiersze znajdują się w górnej części programu (użytkownicy programu Visual Studio powinni upewnić się, że te wiersze pojawiają się po #include „pch.h” lub #include „stdafx.h”, jeśli takie istnieją):
#include <iostream>
#include <limits>Po drugie, dodaj następujący kod na końcu funkcji main() (tuż przed instrukcją return):
std::cin.clear(); // reset any error flags
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignore any characters in the input buffer until we find an enter character
std::cin.get(); // get one more char from the userSpowoduje to, że program będzie czekał, aż użytkownik naciśnie klawisz przed kontynuowaniem, co da ci czas na sprawdzenie danych wyjściowych programu, zanim system operacyjny zamknie okno konsoli.
Inne rozwiązania, takie jak często sugerowane system(„pauza”) może działać tylko w niektórych systemach operacyjnych i należy go unikać.
Starsze wersje programu Visual Studio mogą nie zatrzymywać się, gdy program jest uruchamiany w trybie Rozpocznij od debugowania (F5) . Spróbuj uruchomić w trybie Uruchom bez debugowania (Ctrl-F5) .
P: Uruchomiłem program i pojawiło się okno, ale nie ma żadnych danych wyjściowych.
Twój skaner antywirusowy lub oprogramowanie chroniące przed złośliwym oprogramowaniem może blokować wykonanie. Spróbuj tymczasowo wyłączyć tę funkcję i sprawdź, czy w tym właśnie tkwi problem.
P: Mój program się kompiluje, ale nie działa poprawnie. Co mam zrobić?
Debuguj to! W dalszej części rozdziału 3 znajdują się wskazówki dotyczące diagnozowania i debugowania programów.
Ogólne problemy podczas kompilacji
P: Kiedy kompiluję program, pojawia się błąd dotyczący nierozwiązanego symbolu zewnętrznego _main lub _WinMain@16
Oznacza to, że kompilator nie może znaleźć funkcji main(). Wszystkie programy muszą zawierać funkcję main().
Jest kilka rzeczy do sprawdzenia:
a) Czy Twój kod zawiera funkcję o nazwie main?
b) Czy wartość main jest poprawnie napisana?
c) Czy podczas kompilowania programu widzisz, że plik zawierający funkcję main() jest kompilowany? Jeśli nie, przenieś funkcję main() do istniejącej lub dodaj plik do swojego projektu (zobacz lekcję 2.8 -- Programy z wieloma plikami kodu , aby uzyskać więcej informacji o tym, jak to zrobić).
d) Czy utworzyłeś projekt konsolowy? Spróbuj utworzyć nowy projekt konsoli.
P: Kiedy kompiluję program, pojawia się błąd, że main jest już zdefiniowany lub dotyczy wielu definicji main
Program C++ może mieć tylko jedną funkcję o nazwie main. Twój program C++ ma więcej niż jeden. Sprawdź pliki w swoim projekcie i usuń wszystkie main funkcje z wyjątkiem jednej.
P: Próbuję użyć funkcjonalności C++11/14/17/XX i to nie działa
Jeśli Twój kompilator jest stary, może nie obsługiwać nowszych dodatków do języka. W takim przypadku zaktualizuj swój kompilator.
W przypadku nowoczesnych IDE/kompilatorów Twój kompilator może domyślnie używać starszego standardu językowego. Jak zmienić standard językowy, omawiamy w lekcji 0.12 — Konfigurowanie kompilatora: Wybieranie standardu językowego.
P: Kiedy kompiluję program, pojawia się błąd informujący, że nie można otworzyć pliku .exe do zapisu
Oznacza to, że linker próbuje utworzyć plik wykonywalny, ale nie może. Może się to zdarzyć z kilku powodów:
- Najczęściej plik .exe jest aktualnie uruchomiony. Działającego pliku wykonywalnego nie można zastąpić w trakcie jego działania. Zamknij działający plik .exe i skompiluj go ponownie.
- Twoja ochrona antywirusowa lub ochrona przed złośliwym oprogramowaniem uniemożliwia utworzenie lub wymianę pliku wykonywalnego.
- Plik .exe już istnieje i jest obecnie zablokowany z innego powodu. Spróbuj ponownie uruchomić komputer (aby wymusić zwolnienie blokad), a następnie dokonaj ponownej kompilacji.
W Visual Studio jest to błąd LNK1168.
P: Podczas próby użycia cin, cout lub endl kompilator wyświetla komunikat, że cin, cout lub endl to „niezadeklarowany identyfikator”
Najpierw upewnij się, że u góry pliku został umieszczony następujący wiersz plik:
#include <iostream>Po drugie, upewnij się, że każde użycie cin, cout i endl jest poprzedzone „std::”. Na przykład:
std::cout << "Broccoli" << std::endl;Jeśli to nie rozwiąże problemu, przyczyną może być nieaktualny kompilator lub instalacja jest uszkodzona. Spróbuj ponownie zainstalować i/lub zaktualizować swój kompilator do najnowszej wersji.
P: Kiedy próbujesz użyć endl do zakończenia drukowanej linii, kompilator wyświetla komunikat, że end1 to „niezadeklarowany identyfikator”
Upewnij się, że nie pomyliłeś litery l (mała litera L) w endl z cyfrą 1. endl to wszystkie litery. Upewnij się, że edytor używa czcionki, która wyraźnie odróżnia małą literę L, wielką literę i i cyfrę 1. Również duża litera o i cyfra zero mogą być łatwo pomylone w wielu czcionkach nieprogramistycznych.
Problemy z Visual Studio
P: Podczas kompilacji z Microsoft Visual C++ pojawia się błąd krytyczny C1010 z komunikatem o błędzie typu "c:\vcprojects\test.cpp(263):fatal error C1010: nieoczekiwany koniec pliku podczas wyszukiwania prekompilowanej dyrektywy nagłówka"
Ten błąd występuje, gdy kompilator Microsoft Visual C++ jest ustawiony na używanie prekompilowanych nagłówków, ale jeden (lub więcej) plików kodu C++ nie # zawiera „stdafx.h” ani #include „pch.h” jako pierwszej linii kodu
Naszą sugerowaną poprawką jest wyłączenie prekompilowanych nagłówków, co pokażemy, jak to zrobić w lekcji 0.7 -- Kompilowanie pierwszego programu.
Jeśli chcesz, aby prekompilowane nagłówki były włączone, aby rozwiązać ten problem, po prostu zlokalizuj plik(i) powodujący błąd (w powyższym błędzie winowajcą jest test.cpp) i dodaj następujący wiersz na samej górze pliku plik(i):
#include "pch.h"Starsze wersje programu Visual Studio używają „stdafx.h” zamiast „pch.h”, więc jeśli pch.h nie rozwiąże problemu, spróbuj stdafx.h.
Pamiętaj, że w przypadku programów zawierających wiele plików każdy plik kodu C++ musi zaczynać się od tej linii.
P: Visual Studio wyświetla błąd taki jak: „1MSVCRTD.lib(exe_winmain.obj): błąd LNK2022: nierozwiązany symbol zewnętrzny _WinMain@16, do którego odwołuje się funkcja „int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ)”
Prawdopodobnie utworzyłeś aplikację graficzną systemu Windows, a nie aplikację konsolową. Utwórz ponownie swój projekt i pamiętaj, aby utworzyć go jako projekt dla systemu Windows (lub Win32) Konsola .
P: Kiedy kompiluję program, pojawia się ostrzeżenie „Nie można znaleźć lub otworzyć pliku PDB”
To jest ostrzeżenie, a nie błąd, więc nie powinno mieć to wpływu na Twój program. Jednak jest to denerwujące. Aby to naprawić, przejdź do menu Debugowanie -> Opcje i ustawienia -> Symbole i zaznacz „Microsoft Symbol Server”.
Coś innego
P: Mam inny problem, którego nie mogę rozwiązać. Jak mogę szybko uzyskać odpowiedź?
W miarę przeglądania materiału niewątpliwie będziesz mieć pytania lub napotkasz nieoczekiwane problemy. Dalsze postępowanie zależy od problemu. Ale ogólnie rzecz biorąc, jest kilka rzeczy, które możesz wypróbować.
Najpierw zapytaj wyszukiwarkę. Znajdź dobry sposób na sformułowanie pytania i wyszukaj. Jeśli szukasz komunikatu o błędzie, wklej dokładny komunikat o błędzie, używając cudzysłowów (wyklucz wszelkie nazwy plików i numery wierszy). Istnieje prawdopodobieństwo, że ktoś zadał już to samo pytanie i odpowiedź na nie czeka na Ciebie.
Po drugie, zapytaj sztuczną inteligencję na przykład ChatGPT przez Bing. Rozpocznij swoje pytanie od „W C++”, aby uzyskać odpowiedź specyficzną dla C++. Kilka pomysłów, o które możesz poprosić:
- Wyjaśnienie jakiegoś pojęcia (np. „W C++, czym jest zmienna lokalna?”).
- Różnica między dwiema rzeczami (np. „W C++, jaka jest różnica między wskaźnikiem a referencją?”)
- Demonstracja koncepcji (np. „W C++ napisz krótki program, który dodaje dwie liczby”)
Uwaga że AI mogą zwracać niedokładne lub nieaktualne informacje, a pisane przez nie programy prawdopodobnie nie będą zgodne z najlepszymi współczesnymi praktykami.
Jeśli powyższe zawiedzie, zapytaj na forum pytań i odpowiedzi. Istnieją strony internetowe przeznaczone do programowania pytań i odpowiedzi, takie jak Stack Overflow. Spróbuj opublikować tam swoje pytanie. Pamiętaj, aby dokładnie określić, na czym polega problem i załączyć wszystkie istotne informacje, np. z jakiego systemu operacyjnego korzystasz i jakiego IDE używasz.

