Нет, это не сработает. Препроцессор C / C ++ - это всего лишь текстовый процессор времени «до компиляции». Таким образом, он работает с текстом, найденным как есть в вашем исходном коде.
Вот почему он берет буквальный текст «i», передает его в ваш макрос и расширяет его до буквального текста «xi» в вашем исходном коде. Затем это передается в компилятор. Затем компилятор начинает синтаксический анализ постобработанного текста, находя буквенный токен "xi" как необъявленную переменную, и в процессе набирает обороты.
Вы можете взять ваш пример исходного кода и передать его компилятору gcc (например, я использовал gcc под cygwin, вставляя ваш код в файл с именем pimp.c из-за отсутствия лучшего имени) , Тогда вы получите следующее:
$ gcc pimp.c
pimp.c: In function `main':
pimp.c:9: error: `xi' undeclared (first use in this function)
pimp.c:9: error: (Each undeclared identifier is reported only once
pimp.c:9: error: for each function it appears in.)
Короче говоря, нет, вы не можете этого сделать. Чтобы иметь возможность сделать это, препроцессор должен выступать в роли переводчика. C и C ++ (как правило) не являются интерпретируемыми языками, и препроцессор не является интерпретатором. Мое предложение состоит в том, чтобы очень четко понять различия между компиляторами и интерпретаторами (и между компилируемыми и интерпретируемыми языками.)
Привет.