kmlkamilek Temat założony przez niniejszego użytkownika |
Różnice pomiędzy sposobami ochrony pliku nagłówkowego przed wielokrotnym załączaniem do programu » 2015-06-25 04:13:56 Otóż poznałem dwa sposoby zabezpieczenia pliku nagłówkowego przez wielokrotnym załączeniem do programu. 1. Blok warunkowy #ifndef NazwaPliku_h #define NazwaPliku_h
#endif
2. Dyrektywa pragma z argumentem once Dzięki blokowi warunkowemu, zawartość pomiędzy #ifndef, a #endif jest pomijana, gdy została już w którymś fragmencie kodu załączona. Dyrektywa #pragma once nakazuje by dany plik był załączony tylko raz. Z punktu widzenia ich zastosowania nie zauważyłem powodu by używać obydwóch jednocześnie, jednak w nagłówkach standardowych bibliotek c/c++ dołączonych do Visual C++ 2010, są one używane obie na raz. Przykład: cstddef #pragma once #ifndef _CSTDDEF_ #define _CSTDDEF_ #include <yvals.h>
#ifdef _STD_USING #undef _STD_USING #include <stddef.h> #define _STD_USING
#else #include <stddef.h> #endif
#if _GLOBAL_USING && !defined(RC_INVOKED) _STD_BEGIN using _CSTD ptrdiff_t; using _CSTD size_t; _STD_END #endif
#endif
Są jakieś różnice pomiędzy tymi sposobami? Jest jakiś sens używania ich obu naraz? |
|
DejaVu |
» 2015-06-25 10:36:06 #pragma once - ponoć kompilator dzięki tej dyrektywie jest w stanie nieco szybciej stwierdzić czy ten plik należy ponownie dołączyć czy nie (Visual C++). #ifndef - uniwersalne rozwiązanie, działające pod każdym kompilatorem.
Ja zawsze piszę #pragma once, a potem #ifndef. Jak się przyzwyczaisz, że wszystkie pliki nagłówkowe tak piszesz to nie będzie Ci przeszkadzało to klepanie kilku dodatkowych linii. |
|
kmlkamilek Temat założony przez niniejszego użytkownika |
» 2015-06-25 21:23:41 W sumie fakt, że pragma once może przyśpieszyć kompilację wydaje się logiczny. Plik będzie otwarty jednorazowo i nie będzie musiał być otwierany kilkukrotnie w celu sprawdzenia warunku. Sens używania tego równocześnie, widzę tylko jeden. Uczynić kod uniwersalny dla kompilatorów nie znających pragmy i jednocześnie zapewnić sobie szybszą kompilację jeśli dany kompilator ją wspiera. Trochę naciągane, bo większość obecnych kompilatorów ją wspiera. |
|
Elaine |
» 2015-06-26 01:06:59 #pragma once nie przyspiesza w żaden sposób kompilacji, dzisiejsze kompilatory same są w stanie rozpoznać tradycyjne include guards i nie otwierają w tej sytuacji niepotrzebnie pliku kilka razy. |
|
kmlkamilek Temat założony przez niniejszego użytkownika |
» 2015-06-26 01:58:56 Wg. Wikipedii, #pragma posiada pewne atuty, czyniące ją lepszą od #ifndef, jednak nauki wpajane mi w technikum informatycznym, odradzają mi traktowanie Wikipedii jako rzetelnego źródła. Inną rzeczą jaką znalazłem, to test różnych metod na różnych kompilatorach. Test include guardsNie zwracałbym uwagi na czas, a jedynie na różnice. Swoją drogą: Jak wygląda ten ostatni sposób? |
|
RazzorFlame |
» 2015-06-26 13:31:39 #ifndef PLIK_HPP_INCLUDED #define PLIK_HPP_INCLUDED
#endif
Wygląda o niebo lepiej niż jakieś: Łatwiej się odnaleźć. Poza tym gdy używasz #pragma once to gdy zapomnisz dodać to do jakiegoś nagłówka to będziesz długo szukał :p |
|
kmlkamilek Temat założony przez niniejszego użytkownika |
» 2015-06-26 23:30:41 W sumie dowiedziałem się czego chciałem, ale tematu na razie zamykać nie będę. Może jeszcze ktoś coś ciekawego napisze. :]
@Up
Szczerze mi to różnicy nie robi. Używając #pragma, jeśli gdzieś jej nie wstawię i załączę nagłówek dwa razy, to wyjdzie mi to przed kompilacją. |
|
« 1 » |