\u000d
Ucieczka kończy komentarz bo \u
ucieczek są równomiernie konwertowane do odpowiadających im znaków Unicode zanim program jest tokenized. Można równie używać \u0057\u0057
zamiast //
się rozpocząć komentarz.
Jest to błąd w twoim IDE, który powinien podświetlić składnię linii, aby było jasne, że \u000d
koniec komentarza.
Jest to również błąd projektowy w języku. Nie można go teraz poprawić, ponieważ spowodowałoby to uszkodzenie programów od niego zależnych. \u
znaki ucieczki powinny być albo konwertowane na odpowiedni znak Unicode przez kompilator tylko w kontekstach, w których to „ma sens” (literały łańcuchowe i identyfikatory i prawdopodobnie nigdzie indziej) lub powinny być zabronione generowanie znaków w zakresie U + 0000–007F , lub obie. Każda z tych semantyków uniemożliwiłaby zakończenie komentarza przez \u000d
ucieczkę, bez ingerencji w przypadki, w których \u
użyteczne są ucieczki - zauważ, że to obejmuje użycie \u
ucieczek wewnątrz komentarzy jako sposobu kodowania komentarzy w skrypcie innym niż łaciński, ponieważ edytor tekstów mógłby wziąć szerszy pogląd na to, gdzie\u
sekwencje specjalne są znaczące niż kompilator. (Nie znam jednak żadnego edytora ani IDE, które wyświetlają \u
znaki specjalne jako odpowiednie znaki w dowolnym kontekście).
W rodzinie C występuje podobny błąd projektowy 1, w którym nowa kreska ułamkowa odwrócona jest przetwarzana przed określeniem granic komentarzy, np.
// this is a comment \
this is still in the comment!
Przedstawiam to, aby zilustrować, że łatwo jest popełnić ten konkretny błąd projektowy, i nie zdaję sobie sprawy, że jest to błąd, dopóki nie jest za późno, aby go naprawić, jeśli jesteś przyzwyczajony do myślenia o tokenizacji i analizowaniu sposobu myślenia programistów kompilatora o tokenizacji i analizie. Zasadniczo, jeśli już zdefiniowałeś swoją formalną gramatykę, a następnie ktoś wymyślił specjalny składniowy przypadek - trigrafy, ukośnik-nowa linia, kodowanie dowolnych znaków Unicode w plikach źródłowych ograniczonych do ASCII, cokolwiek - które muszą być zaklinowane, łatwiej jest dodaj przepustkę transformacji wcześniej tokenizerem, aby zdefiniować tokenizator, aby zwrócić uwagę na to, gdzie warto użyć tego specjalnego przypadku.
1 Dla pedantów: Zdaję sobie sprawę, że ten aspekt C był w 100% zamierzony, a uzasadnienie - nie zmyślam tego - że pozwoli ci na mechaniczne dopasowanie kodu z dowolnie długimi liniami do perforowanych kart. To wciąż była niepoprawna decyzja projektowa.