Ponieważ wydaje się, że jest to nieporozumienie, ciąg 1aa
jest prawidłowym tokenem preprocessor; jest to przypadek pp-number
, której definicja (§ 6.4.8 obecnego standardu C)
pp-number:
digit
. digit
pp-number digit
pp-number identifier-nondigit
pp-number e sign
pp-number E sign
pp-number p sign
pp-number P sign
pp-number .
Innymi słowy, pp-number
zaczyna się od cyfr lub ., po którym następuje cyfra, a następnie może zawierać dowolną sekwencję cyfr, "identyfikatory-nie-znaczniki" (to znaczy litery, podkreślenia i inne elementy, które mogą być częścią identyfikatora) lub litery e lub p (wielkie lub małe litery), po których następuje znak plus lub minus.
Oznacza to, że na przykład 0x1e+2
jest prawidłowym pp-number
, natomiast 0x1f+1
nie jest (to trzy tokeny). W ważnym programie każdy kod pp-number
, który przetrwał fazę przetwarzania wstępnego, musi spełniać składnię pewnej stałej liczbowej, co oznacza, że program zawierający tekst 0x1e+2
zostanie uznany za nieprawidłowy. Morał, jeśli taki istnieje, to wielkoduszne użycie białych znaków; to nie kosztuje.
Intencją pp-number
jest uwzględnienie wszystkiego, co może ostatecznie być liczbą w jakiejś przyszłej wersji C. (Pamiętaj, że po numerach mogą występować sufiksy literowe wskazujące typy i sygnatury, takie jak 27LU
).
Jednak int*
nie jest prawidłowym tokenem preprocesora. Są to dwa tokeny (podobnie jak -3
), więc nie można ich utworzyć za pomocą operatora łączenia znaczników.
Kolejną dziwną konsekwencją reguły polegającej na wstawianiu tokena jest to, że nie można wygenerować prawidłowego tokena ...
poprzez łączenie tokenów, ponieważ ..
nie jest prawidłowym tokenem. (a##b##c
musi być oszacowany w pewnej kolejności, więc nawet jeśli wszystkie trzy makra preprocesora rozszerzają się do ., musi wystąpić próba utworzenia tokena ..
, który nie powiedzie się w kompilatorach must, chociaż wierzę, że Visual Studio je akceptuje.)
Wreszcie, symbole komentarza /*
i //
są nie są to tokenów; komentarze są zastępowane białymi znakami przed oddzieleniem tekstu programu na tokeny. Nie można więc utworzyć komentarza z wklejonymi tokenami (przynajmniej nie w zgodnym kompilatorze).
Pytanie o linki jest nie na temat. I możesz otrzymać pomoc, jeśli rzeczywiście pokazujesz, co przekazałeś, aby spowodować ten błąd. – StoryTeller
Myślę, że '1aa' nie jest prawidłowym tokenem przetwarzania wstępnego –
nie należy do żadnego z 6 typów tokenów, ale gcc nic o nim nie mówi, nawet ostrzeżenie? – Sabrina