Как вставить целое число в строку макроса?

Я впервые вижу стрингификацию и вставку токенов. Я чувствую, что это может быть хорошим инструментом для этого макроса:

#define MY_NUMBER   3
#define MY_STRING   "the number three: ##MY_NUMBER"
printf("%s\n", MY_STRING);

должен вывести:

the number three: 3

person tarabyte    schedule 01.09.2015    source источник
comment
Что не так с printf("%s %d\n", MY_STRING, MY_NUMBER)???   -  person barak manos    schedule 01.09.2015
comment
printf предназначен только для тестирования. Настоящий вопрос заключается в создании макроса.   -  person tarabyte    schedule 01.09.2015
comment
Операторы препроцессора (# и ##) не работают внутри строковых литералов в кавычках. Вы также не можете использовать конкатенацию токенов для конкатенации строковых литералов; только отдельные токены. (Однако вы можете объединить два строковых литерала, просто написав их один за другим: "Hello, " "world!"). И, наконец, вы можете использовать оператор stringify (#) только для параметров макроса. @alk: Связанный ответ хорош, но я боюсь, что на самом деле это не ответ на эту путаницу.   -  person rici    schedule 01.09.2015


Ответы (1)


попробуй это

#define S_(x) #x
#define S(x) S_(x)

#define MY_NUMBER   3
#define MY_STRING   "the number three: " S(MY_NUMBER)
person BLUEPIXY    schedule 01.09.2015
comment
Почему вы не написали #define S(x) #x напрямую? - person Nasr; 01.09.2015
comment
@Nasr, если S(MY_NUMBER), то ты получишь "MY_NUMBER" - person BLUEPIXY; 01.09.2015
comment
@BLUEPIXY, это работает, но я не понимаю, почему? Можете ли вы объяснить немного больше о том, что может делать этот второй S_(x)? - person tarabyte; 01.09.2015
comment
@tarabyte Необходимо косвенно вызывать make MY_NUMBER expand 3. #var преобразует var в "var". - person BLUEPIXY; 01.09.2015