Поскольку #parameter
является частью расширения macro . Все это делается препроцессором еще до того, как компилятор увидит код. И этот токен применяется только к макропараметрам.
Рассмотрим следующий макрос:
#define STR(x) #x
Str(Hello)
- это "Hello"
Но если мы напишем #word в коде, препроцессор не увидит это как часть макроса, и word не является параметром макроса. Таким образом, препроцессор игнорирует это. Компилятор видит одно и то же слово и ничего не знает, что с ним делать. Таким образом, он сообщает об ошибке. Рассмотрим следующий текст, разработанный препроцессором.
#define STR(x) #x
const char * str=STR(Hello);
const char * buggy_str=#Hello;
Результат будет:
const char * str="Hello";
const char * buggy_str=#Hello;
Компилятор C видит первую строку, и он в порядке. Но когда он видит вторую строку, он ничего не знает о токене #
и, таким образом, сообщает об ошибке.