Czym się różni "pragma once" od "ifndef define endif"

0

prowadzać wykopaliska na forum trafiłem na taki wpis

Ranides napisał(a):

bo to pragma jest ;P
//quetz: #pragma once z tego co wiem jest oznaczone w coraz wiekszej ilosci kompilatorow jako 'deprecated'

Pojawia mi się kilka pytań:

  • dlaczego pragma once nie jest w standardzie, czy też standard to brak standardu ?
  • czy jest jakaś subtelna różnica pomiędzy pragma once a ifndef define endif czy któraś metoda zabezpieczenia pliku nagłówkowego jest lepsza ?
  • czy pragma once moze zniknąć z jezyka c++ ?
1

Moim skromnym zdaniem: Lepiej używać ifndef define endif, ale w praktyce nie ma to znaczenia. Jeżeli są dwa sposoby na to samo, a tylko jeden z nich jest w standardzie, to chyba lepiej korzystać z tego standardowego. Program Qt creator, przy tworzeniu nowej klasy, od razu daje ifndef define endif do pliku *.h.

Pragma once zazwyczaj jest obsługiwany, ale brak tego czegoś w standardzie sprawia, że nie ma gwarancji, ze w każdym kompilatorze to będzie, choć ten fakt zazwyczaj ma marginalne znaczenie, bo rzadko kiedy zdarza się nagła potrzeba zmiany używanego kompilatora na zupełnie inny.

1

A to nie jest tak, że #pragma once dotyczy tylko MSVC?

edit:
Z tego, co tak na szybko wygooglałem, to #pragma once nie jest przez gcc obsługiwana do 3.4. Potem teoretycznie, bo nie weryfikowałem bardziej wnikliwie, #pragma once będzie "szybsza', niż #ifndef #endif

Na stronie microsoftu zalecają, żeby dodawać alternatywnie oba rozwiązania, gdy nie masz pewności, czy kompilator to ogarnie.

Linki:

1
  • czy jest jakaś subtelna różnica pomiędzy pragma once a ifndef define endif czy któraś metoda zabezpieczenia pliku nagłówkowego jest lepsza ?

Majac duzego pecha w ifndef mozna zduplikowac nazwy. pragma once - nie moj problem. Niech kompilator sie martwi. Zreszta zeby umozliwic zduplikowanie nazwy to najpierw trzeba ja wymyslic - nieprzyjemne.

  • czy pragma once moze zniknąć z jezyka c++ ?

A czy preprocessor moze zniknac z jezyka C++? Czy w ogole preprocessor jest czescia jezyka C++ ? Serio pytam. Zawsze byl i nie wnikalem skad sie tam wzial.

4

#pragma once działa w oparciu o ścieżkę.
Jak masz jedną kopię header to nie problem. Ale wystarczy, że z dowolnego powodu będziesz miał kopię pliku nagłówkowego (bo trzeba coś skopiować, bo masz dwie wersje biblioteki, bo ...), a zaczną się dziwne przygody.
Na dodatek, #pragma once nie ma w standardzie, ale wszystkie kompilatory to honorują.

0

Z tego co czytałem, #pragma once może być szybsze. Poza tym nie naraża na błąd (zduplikowana zmienna preprocesora). Chyba z tego wszystkiego jest najistotniejsze to, że nie można zapomnieć #endif czy na przykład zamknąć je wcześniej, bo używasz dalej #ifdef, ale kończysz 2 razy.

0

Ja używam tylko pragmy w swoich prywatnych projektach. W tych projektach co miałem doczynienia to zazwyczaj if def aczkolwiek spotkałem pomieszanie obu. Soft na tak starych wersjach toolchain co nie uznaje pragma once to już nie wiem czy się buduje jeszcze na świecie(co najstarsze jeszcze legacy to widziałem wersję gcc 4.X).
czy może zniknąc z toolchain? możliwe ale mało pradwopodobne za szeroko używane.

0
eleventeen napisał(a):

A czy preprocessor moze zniknac z jezyka C++? Czy w ogole preprocessor jest czescia jezyka C++ ? Serio pytam. Zawsze byl i nie wnikalem skad sie tam wzial.

Preprocesor to jest tak naprawdę prymitywny przetwarzacz tekstu (operacje "znajdź i zamień", "wstaw wskazany plik w tym miejscu" i inne podobne), który nie jest zależny od języka, ani nie jest jego częścią. To nawet nie musi być język programowania, może to być dowolny tekst, byle nie zawierał linii zaczynających się od #, bo na ten znak preprocesor jest wyczulony. Ale z drugiej strony, nie spotkałem kompilatora, ani IDE języka innego niż C lub C++, w którym działa taki sam preprocesor, mimo, że jest to możliwe. Dopiero przetworzony kod źródłowy jest kompilowany.

1

dlaczego pragma once nie jest w standardzie

Bo #pragma to cały zestaw narzędzi i jednego z nich nie ma sensu wprowadzać. Strażnik nagłówka nie powinien być w ogóle potrzebny, jak już zmieniać coś w standardzie to na coś, żeby nie być zobligowanym do wstawiania czegokolwiek.

czy pragma once moze zniknąć z jezyka c++ ?

Jest to niestandardowy dodatek do kompilatorów, także teoretycznie tak. Tym nie mniej, MS używa pragmy na potęgę i nie widzę powodu dla którego mieliby sabotować swój własny software.

Z tego, co tak na szybko wygooglałem, to #pragma once nie jest przez gcc obsługiwana do 3.4

Wersja 3.4 wyszła siedemnaście lat temu.

Moje podejście jest następujące, jeśli programujesz tylko na windowsa to możesz sobie wybrać, które podejście Ci bardziej pasuje. Jak chcesz pisać wieloplatformowo to lepiej użyć standardowego podejścia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1