C jest, jak wiadomo, językiem raczej niskiego poziomu, jak HLL. C ++, choć może wydawać się językiem znacznie wyższego poziomu niż C, nadal ma wiele cech. Jedną z tych cech jest to, że języki zostały zaprojektowane przez programistów dla programistów - a konkretnie programistów, którzy wiedzieli, co robią.
[Do końca tej odpowiedzi skupię się na C. Większość tego, co powiem, dotyczy również C ++, choć może nie tak mocno. Chociaż, jak słynie Bjarne Stroustrup, „C ułatwia strzelanie sobie w stopę; C ++ utrudnia, ale kiedy to robisz, zdmuchuje całą nogę”. ]
Jeśli wiesz, co robisz - naprawdę wiesz, co robisz - czasem może być konieczne „złamanie zasad”. Ale przez większość czasu większość z nas zgadza się, że dobre intencje chronią nas przed kłopotami i że bezmyślne łamanie tych zasad przez cały czas jest złym pomysłem.
Ale w C i C ++ istnieje zaskakująco duża liczba rzeczy, które możesz zrobić, które są „złymi pomysłami”, ale które nie są formalnie „niezgodne z regułami”. Czasami są czasem złym pomysłem (ale czasem można je obronić); czasami są to zły pomysł praktycznie przez cały czas. Ale tradycją zawsze nie było ostrzeganie o tych rzeczach - ponieważ ponownie założono, że programiści wiedzą, co robią, nie robiliby tych rzeczy bez dobrego powodu, byliby zirytowani przez grupę niepotrzebnych ostrzeżeń.
Ale oczywiście nie wszyscy programiści naprawdę wiedzą, co robią. W szczególności każdy programista C (bez względu na to, jak doświadczony) przechodzi fazę bycia początkującym programistą C. Nawet doświadczeni programiści C mogą być nieostrożni i popełniać błędy.
Wreszcie, doświadczenie pokazało nie tylko, że programiści popełniają błędy, ale że błędy te mogą mieć realne, poważne konsekwencje. Jeśli popełnisz błąd, a kompilator nie ostrzeże Cię o tym, a w jakiś sposób program nie zawiesi się natychmiast lub nie zrobi z tego powodu czegoś oczywistego niewłaściwego, błąd może czaić się tam, ukryty, czasami przez lata, dopóki nie spowoduje naprawdę duży problem.
Okazuje się więc, że w większości przypadków ostrzeżenia są dobrym pomysłem. Nawet doświadczeni programiści nauczyli się (tak naprawdę „ szczególnie doświadczeni programiści nauczyli się”), że w sumie ostrzeżenia przynoszą więcej korzyści niż szkody. Za każdym razem, gdy celowo zrobiłeś coś złego, a ostrzeżenie było uciążliwe, prawdopodobnie co najmniej dziesięć razy zrobiłeś coś nie tak przez przypadek, a ostrzeżenie uratowało cię od dalszych kłopotów. I większość ostrzeżeń można wyłączyć lub obejść kilka razy, gdy naprawdę chcesz zrobić coś „złego”.
(Klasycznym przykładem takiego „błędu” jest test if(a = b)
. Przez większość czasu jest to błąd, więc większość kompilatorów obecnie ostrzega przed nim - niektóre nawet domyślnie. Ale jeśli naprawdę chcesz zarówno przypisać b
do niego, jak a
i przetestować w rezultacie możesz wyłączyć ostrzeżenie, pisząc if((a = b))
.)
Drugie pytanie brzmi: dlaczego chcesz poprosić kompilator o traktowanie ostrzeżeń jako błędów? Powiedziałbym, że to z powodu ludzkiej natury, a szczególnie zbyt łatwej reakcji powiedzenia „Och, to tylko ostrzeżenie, to nie jest tak ważne, posprzątam to później”. Ale jeśli jesteś prokrastynatorem (a ja nie wiem o tobie, ale jestem okropnym prokrastynatorem), łatwo jest odłożyć niekoniecznie porządki w zasadzie na zawsze - a jeśli masz zwyczaj ignorowania ostrzeżeń, coraz łatwiej przeoczyć ważny komunikat ostrzegawczy, który siedzi tam, niezauważony, pośród wszystkich, które ignorujesz.
Poproszenie kompilatora, aby traktował ostrzeżenia jako błędy, jest małą sztuczką, w którą możesz się zagrać, aby obejść ten ludzki pomysł.
Osobiście nie nalegam na traktowanie ostrzeżeń jak błędów. (W rzeczywistości, jeśli mam być szczery, mogę powiedzieć, że praktycznie nigdy nie włączam tej opcji w moim „osobistym” programowaniu). Ale możesz być pewien, że mam włączoną tę opcję w pracy, gdzie nasz przewodnik po stylu (który ja napisał) nakazuje jego użycie. I powiedziałbym - podejrzewam, że powiedziałby większość profesjonalnych programistów - że każdy sklep, który nie traktuje ostrzeżeń jako błędów w C, zachowuje się nieodpowiedzialnie, nie przestrzega powszechnie przyjętych najlepszych praktyk branżowych.