2013-07-19 6 views
6

#pragma once nie jest standardem, ale jest obsługiwany przez kompilatory takie jak gcc i VC++. Pomaga unikać strażników integracyjnych.Czy #pragma raz dodaje osłony włączające?

Ale czy wewnętrznie kompilator dodaje osłony włączające dla #pragma raz? Jeśli nie, w jaki sposób kompilator zapewnia, że ​​taki nagłówek jest zawarty tylko raz?

+0

Wyobrażam sobie, że kompilator po prostu śledzi, które pliki nagłówkowe zostały dołączone i gdzie. –

+0

Prawdopodobnie coś podobnego do wykrycia cyklu na grafie skierowanym. –

+0

@OliCharlesworth Nie można uniknąć możliwości, ale w dużym projekcie, czy nie może być tysięcy plików nagłówkowych? Czy będzie to skuteczny sposób? –

Odpowiedz

10

Jestem pewien, że działa tak samo jak include_once w PHP - jest tam tabela "plików, które zostały uwzględnione". W tym przypadku kompilator szuka na liście pliku, który ma zamiar uwzględnić, i jeśli plik został już dołączony, nie dołączaj go ponownie. Jeśli kompilator podczas przetwarzania pliku zobaczy plik #pragma once, dodaj ten plik do "plików, które zostały już dołączone".

To nie jest to samo, co osłony na poziomie szczegółowości, ale ma taki sam efekt, jak osłony wtrąceniowe. Dzięki temu kod jest mniej przenośny, ponieważ istnieje wiele kompilatorów, które tego nie obsługują.

+3

Właściwie wszystkie podstawowe kompilatory obsługują go w dzisiejszych czasach. –

+2

"wszystkie podstawowe" prawdopodobnie nie obejmują większości wbudowanych serwerów ... I jeśli można zauważyć, że "to nie zadziała, jeśli kod zostanie skompilowany we wbudowanym kompilatorze", jestem pewien, że użyj go z powrotem na innych, gdy ich argument nie powiedzie się w tym punkcie ...;) –

+1

Z przyjemnością pisałem aplikacje dla wielu wbudowanych rozwiązań, używając '#pragma once' w GCC od wersji 4.4.0. Fajnie jest wysuwać argumenty oparte na założeniu, że ktoś nigdy nie słyszał o wbudowanym środowisku programistycznym lub go nie widział, ale zazwyczaj najpierw rozważa sprawdzanie faktów. ;) –

0

Nie, kompilator nie będzie dodawał załączników, ale to nie powinno mieć znaczenia, ponieważ nie będzie zawierał tego samego pliku ponownie, więc nigdy nie uzyskałby zmiany w celu oceny tych osłon w pierwszej kolejności.

+0

To jest właściwie moje pytanie, skąd wie, że nie ma tego samego pliku. –

+1

@ppk: Może śledzić, które nazwy plików już '# include'd używa pamięci komputera. To nie jest pytanie. Skąd wiadomo, że nie należy dwukrotnie pisać tego samego pytania na SO? –

+2

Jeden znaczący wyjątek: jeśli ten sam plik to '# include'd przez dwie różne nazwy plików (np. Dowiązania symboliczne lub twarde w systemie * nix), to' #pragma once' nie będzie działać, ponieważ jest to na podstawie nazwy pliku. Chociaż typowe "#ifndef/# define' guard" nadal będzie działało. – abelenky

-2

Dodając "#pragma once" do pliku "file.h", kompilator pomoże nam upewnić się, że plik "file.h" zostanie otwarty tylko noce.

Ale jeśli mam duplikat "file.h" o nazwie "file_copy.h", jeśli jest dołączony, zostanie otwarty.

+1

To jest to, co robi, a nie _how_. –

+0

Tak, przepraszam za to. –