2014-10-05 13 views
8

Uczę się C++ i próbuję napisać dobry kod. Jestem obecnie za pomocą lof flag kompilatora, takich jakJaką flagę należy zastosować, aby wymusić dobry styl C++ 11?

-Wextra -Wall -pedantic -Werror -Wfatal-errors -Wcast-qual -Wcast-align -Wconversion -Wdouble-promotion -Wfloat-equal -Wshadow -Wpointer-arith -Weffc++ -ansi -Wstrict-aliasing

Właśnie dowiedziałem się, że słowa kluczowe new i delete nie powinien być stosowany już w C++ 11. Jednak nie mam żadnych ostrzeżeń, kiedy ich używam.

Czy są jakieś flagi, które należy zastosować, aby zapewnić dobry styl C++ 11?

+11

* Właśnie dowiedziałem się, że słowa kluczowe new i delete nie powinny być już używane w C++ 11. * Gdzie to przeczytałeś? Jesteś pewien, że to zrozumiałeś? Odradza ci się używać surowych wskazówek, w których będziesz musiał się martwić uwolnieniem ressource później. Nie można tak naprawdę unikać użycia 'new' i' delete' i nie ma powodu, aby to robić. Możesz ukryć, używając 'new' za wywołaniem, np.' Std :: make_unique() 'lub' std :: make_shared() ', ale za kulisami są to po prostu zawijane wywołania' new'. – Mario

+7

@Mario: nowoczesne C++ tak naprawdę nie musi często używać 'delete', wiele aplikacji byłoby najlepiej obsłużonych przez nie wywoływanie go bezpośrednio (i rzadko nazywanie' new'). Masz rację, kwestionując, czy problem z PO to czysty dogmat, ale "usuń" w kodzie aplikacji to czerwona flaga. Jednak przy tak dużej ilości kodu biblioteki w nagłówkach we współczesnym C++, istnieje również fakt, że 'delete' może pojawić się w kompilatorze nawet wtedy, gdy użytkownik go nie napisał. To jest najtrudniejsza rzecz w ostrzeżeniach - większość kompilatorów nie rozróżnia "twojego" kodu od "swojego" kodu. –

+0

@Mario chodzi o to, że * ty * nigdy nie powinieneś ich używać, niektóre biblioteki. – o11c

Odpowiedz

5

Po pierwsze, musisz zdać sobie sprawę, że twój kompilator nigdy nie będzie całkowicie wymuszał dobrego stylu.

Istnieją jednak dwie techniki, których możesz użyć dla kompilatora, aby pomóc wymusić własny styl: ostrzeżenia (które mogą być przekazywane z linii poleceń lub w pragmy) i trucizny pragmy.

Trudno jest jednak zarządzać dokładnym zestawem ostrzeżeń, które są dostępne w każdej wersji kompilatora, dlatego wykonałem a list of warnings. Zauważ, że wsparcie dla klang jest minimalne, jego ostrzeżenia są zwykle gorsze od gcc w praktyce, pomimo ich fantastycznego marketingu; poza tym nie jest możliwe wykrycie, której wersji języka używa się do usuwania błędów (makra wykrywania cech są raczej bezwartościowe).

Wykonałem również a list of poison.

Dodatkowo, mam trochę magii makefile, która zapewnia, że ​​powyższe dwie techniki są stosowane do każdego stosownego pliku, a także wykonuje inne kontrole.

Należy jednak zauważyć, że każda aplikacja ma inne potrzeby, dlatego te nagłówki nie powinny być używane w obecnej formie. Bardzo niewiele aplikacji, na przykład, chciałoby zatruć std::string, tak jak ja.

+0

Dziękuję, nie wiedziałem, pragma, robi to, co chciałem! –

+0

Zatrucie dynamic_cast nie ma sensu IMHO, zamiast tego użyj -fno-rtti. – Nils

+0

@Nils rtti jest przydatny dla więcej niż 'dynamic_cast'. – o11c

Powiązane problemy