Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Różnice pomiędzy sposobami ochrony pliku nagłówkowego przed wielokrotnym załączaniem do programu

Ostatnio zmodyfikowano 2015-06-26 23:30
Autor Wiadomość
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
C/C++
#ifndef NazwaPliku_h
#define NazwaPliku_h

// Kod

#endif

2. Dyrektywa pragma z argumentem once
C/C++
#pragma 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
C/C++
// cstddef standard header
#pragma once
#ifndef _CSTDDEF_
#define _CSTDDEF_
#include <yvals.h>

#ifdef _STD_USING
#undef _STD_USING
#include <stddef.h>
#define _STD_USING

#else /* _STD_USING */
#include <stddef.h>
#endif /* _STD_USING */

#if _GLOBAL_USING && !defined(RC_INVOKED)
_STD_BEGIN
using _CSTD ptrdiff_t; using _CSTD size_t;
_STD_END
#endif /* _GLOBAL_USING */

#endif /* _CSTDDEF_ */

/*
* Copyright (c) 1992-2009 by P.J. Plauger.  ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
V5.20:0009 */

Są jakieś różnice pomiędzy tymi sposobami? Jest jakiś sens używania ich obu naraz?
P-134057
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.
P-134062
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.
P-134091
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.
P-134095
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 guards

Nie zwracałbym uwagi na czas, a jedynie na różnice.
Swoją drogą: Jak wygląda ten ostatni sposób?
P-134096
RazzorFlame
» 2015-06-26 13:31:39
C/C++
#ifndef PLIK_HPP_INCLUDED
#define PLIK_HPP_INCLUDED

// kod

#endif //PLIK_HPP_INCLUDED
Wygląda o niebo lepiej niż jakieś:
C/C++
#pragma once

//kod
Ł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
P-134098
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ą.
P-134106
« 1 »
  Strona 1 z 1