Совместное использование операторов предварительной обработки '#' и '##' - PullRequest
0 голосов
/ 26 января 2019

Из того, что я прочитал, я понимаю, что оператор # используется с параметрическим макросом для преобразования его параметра в строку, а ## используется для объединения двух параметров или параметра с каким-либо другим идентификатором (Поправьте меня, если мой понимание неверно).

Но как я могу одновременно использовать операторы # и ##? Я попробовал это сделать:

#define str(n)  #n ## #n

Я думал тогда

printf("%s",str(Hello))

будет расширен как

printf("%s", "Hello""Hello")

И так как смежные строки автоматически объединяются, чтобы создать одну строку в C, то это приведет к printf("%s", "HelloHello"), а результат будет HelloHello. Но история была другая, она выдает ошибку:

вставка "привет" и "привет" не дает действительный токен предварительной обработки

Пожалуйста, объясните мне, как расширяются эти параметрические макросы с операторами # и ##.

1 Ответ

0 голосов
/ 26 января 2019

## "объединение двух параметров" - это огромное упрощение. Этот оператор присоединяется к токенам . И результатом должен быть один действительный токен. Два строковых литерала не могут быть вставлены в один токен.

Кроме того, конкатенация строковых литералов обрабатывается на более позднем этапе перевода. Итак, очевидное исправление для вашего макроса - вообще не использовать ##.

#define str(n) #n #n

Но если вы действительно хотите использовать оба, тогда вам нужно вставить токен перед stringifying. И сделать это через расширение промежуточного макроса.

#define str(n) str_(n ## n)
#define str_(nn) #nn
...