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?