Так как это кажется путаницей, строка 1aa
является действительным препроцессором token; это экземпляр pp-number
, чье определение (§ 6.4.8 текущего стандарта 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 .
Другими словами, pp-number
начинается с цифрой или ., а затем цифра, после чего она может содержать любую последовательность цифр, «идентификатор-недра» (то есть буквы, символы подчеркивания и другие элементы, которые могут быть частью идентификатора) или буквы e или p (верхний или нижний регистр), за которым следует знак плюс или минус.
Это означает, что, например, 0x1e+2
является действительным pp-number
, а 0x1f+1
- нет (это три знака). В действительной программе каждый pp-number
, который переживает фазы предварительной обработки, должен удовлетворять синтаксису некоторого числового представления константы, что означает, что программа, которая включает текст 0x1e+2
, будет считаться недействительной. Моральная, если таковая есть, заключается в том, что вы должны щедро использовать пробелы; он не имеет стоимости.
Цель состоит в том, чтобы включить все, что могло бы быть числом в некоторой будущей версии C. (Помните, что за числами могут следовать буквенные суффиксы, указывающие типы и подпись, такие как 27LU
).
Однако int*
не является допустимым токеном препроцессора. Это два токена (как и -3
), и поэтому он не может быть сформирован с помощью оператора конкатенации токенов.
Другим нечетным следствием правила подписи маркера является то, что невозможно создать действительный токен ...
через конкатенацию маркера, поскольку ..
не является допустимым токеном. (a##b##c
должен быть оценен в некотором порядке, поэтому, даже если все три макроса препроцессора расширяются до ., должна быть попытка создать токен ..
, который не сработает в компиляторах must, хотя я считаю, что Visual Studio принимает его.)
И, наконец, символы комментариев /*
и //
являются не токены; комментарии заменяются пробелами перед разделением текста программы на токены. Таким образом, вы не можете создавать комментарий с использованием маркера в качестве (либо, по крайней мере, не в совместимом компиляторе).
Запрашивать ссылки не по теме. И вы можете получить помощь, если вы действительно показываете, что вы передали, чтобы вызвать эту ошибку. – StoryTeller
Я думаю, что '1aa' не является допустимым токеном предварительной обработки –
, он не принадлежит к 6 типам токенов, но gcc ничего не говорит об этом даже не о предупреждении? – Sabrina