Ten dokument w sekcji 2.6 „Obliczone obejmuje” zawiera następujący akapit:
Jeśli linia zostanie rozwinięta do strumienia tokena rozpoczynającego się od <tokena i zawierającego token>, wówczas tokeny między <a pierwszym> są łączone w celu utworzenia nazwy pliku, która ma zostać uwzględniona. Każda biała spacja między tokenami jest zredukowana do pojedynczej spacji; następnie dowolne spacja po początkowym <zostaje zachowane, ale końcowe spacja przed zamknięciem> jest ignorowane . CPP wyszukuje plik zgodnie z zasadami obejmującymi nawiasy kątowe.
Wiem, że to jest implementacja zdefiniowana, ale dlaczego tak musi być dla GCC? Mam na myśli szczególnie podkreślone zdanie powyżej.
EDYTOWAĆ
Właśnie zauważyłem, że trzeci akapit przed cytowanym powyżej mówi:
Podczas definiowania makra należy zachować ostrożność.
#define
zapisuje tokeny, a nie tekst. Preprocesor nie może wiedzieć, że makro zostanie użyte jako argument#include
, więc generuje zwykłe tokeny, a nie nazwę nagłówka. Jest mało prawdopodobne, aby powodowało to problemy, jeśli użyjesz cudzysłowów zawierających, które są wystarczająco zbliżone do stałych ciągów. Jeśli jednak użyjesz nawiasów kątowych, możesz mieć problemy .
Czy ktoś wie, jakie problemy są tutaj wskazywane?
źródło
Odpowiedzi:
Wydaje mi się, że implementator wybrał najprostszy sposób, kiedy wdrożył tę funkcjonalność, nie zastanawiając się długo.
Wydaje się, że pierwsze wdrożenie wylądowało w 2000-07-03 (dwie dekady temu!). Odpowiednia część wygląda ( źródło ):
W szczególności wybucha, gdy widzi
CPP_GREATER
token (tj.>
), Zanim zarezerwuje pamięć dla tokena. Ma to sens, ponieważ nie trzeba przydzielać pamięci, gdy token nie zostanie zapisany w buforze.Następnie dopiero po zarezerwowaniu pamięci preprocesor sprawdza, czy token ma poprzednią spację (
t->flags & PREV_WHITE
), a kiedy to robi, zapisuje znak bufora w buforze.W rezultacie, w
< foo / bar >
, tylko białe spacje przedfoo
(to znaczy po początkowym<
)/
ibar
są zachowywane.źródło
if (t->flags & PREV_WHITE) CPP_PUTC_Q (pfile, ' ');
sprzeczny z tym, co zostało powiedziane w dokumencie: „Jakakolwiek biała spacja między tokenami jest zredukowana do pojedynczej spacji; ...”?