czy może wskazać _praktyczny_rzeczywisty_projekt_ w którym napotkał sytuację wiązania linkami twardymi plików i gdzie pragma sobie nie poradziła? |
Zacytuję swój post:
W praktyce kompilatory przybliżają to porównując numer urządzenia i iwęzła |
Czym charakteryzują się hardlinki? Tym, że na danym systemie plików dwie różne nazwy odnoszą się do tego samego iwęzła, więc para
(dev, ino) dla dwóch hardlinków będzie taka sama.
W rzeczywistości większym problemem są wszelkie sytuacje, gdzie dwa różne systemy plików według kernela są jednym systemem plików. Gdy któryś raz z rzędu zdarzyło mi się spowodować "redefinicje" (i to dość wredne, bo np. spod IDE działało, ale kompilacja z palca już nie), bo nagłówek był na dysku lokalnym, który jednocześnie był eksportowany po sieci i zamontowany (żeby mieć tą samą ścieżkę na wszystkich komputerach i nie musieć pamiętać, na którym pracuję) to stwierdziłem, że mam dość
#pragma once.
1. Zaśmiecanie 1 i trudnej w kontroli przestrzeni nazewniczej 2. Nakładanie się przestrzeni nazewniczych w bibliotekach (zawsze znajdzie się taki który wybierze nazwę a ja w nią "wdepnę" :-/) |
Więc zamiast wymyślać nazwy, generuj je. Jeśli nazwa makra jest tworzona z UUIDu, to te problemy przestają być problemami (chyba że na codzień stykasz się z kodem, który używa identyfikatorów w rodzaju
INCLUDED_FB6A84BB6FEB48C6B30886391376FE07, ale wtedy współczuję).
Widać więc że i twórcy boost'a stosują |
Tylko, jeśli kompilator obsługuje (patrz
BOOST_HAS_PRAGMA_ONCE) i głównie po to, by kompilatory, które implementują
#pragma once, a nie rozpoznają makr wartowniczych (czyli kompilator Microsoftu, są jakieś inne?), były w stanie pominąć ponowne odczytywanie pliku.
Ponieważ jednak boost stara się wspierać również Solaris Studio, które
w ogóle nie obsługuje #pragma once, to boost używa przede wszystkim makr wartowniczych.
Swoją drogą:
>> find /usr/include/boost/ -name '*.hpp' | wc -l
10215
>> grep -c "#[[:space:]]*pragma once" /usr/include/boost/**/*.hpp | cut -d':' -f2 | grep -c '^[^0]'
2502
Tylko ćwierć plików używa
#pragma once.