Объединить int в строку с помощью препроцессора C

91

Я пытаюсь понять, как я могу объединить #define'd int в #define' d строку с помощью препроцессора C. Мой компилятор - GCC 4.1 для CentOS 5. Решение также должно работать для MinGW.

Я хотел бы добавить номер версии к строке, но единственный способ заставить его работать - это сделать копию номера версии, определенной как строки.

Самое близкое, что я смог найти, это метод цитирования аргументов макроса, но он не работает для #defines

Это не работает.

Она не работает без #с либо потому , что значения числа и будет расширяться "/home/user/.myapp" 2 6, что не является действительным C .

Это работает, но мне не нравится иметь копии определений версии, потому что они мне тоже нужны в виде чисел.

Jonescb
источник
3
Возможный дубликат Преобразования токена препроцессора в строку
Ciro Santilli 郝海东 冠状 病 六四 事件

Ответы:

173

Классический вопрос о препроцессоре C ....

Дополнительный уровень косвенного обращения позволит препроцессору раскрыть макросы до их преобразования в строки.

Lindydancer
источник
3
STR () в этом случае выдаст Узкую строку. Есть ли вариант для преобразования этого в широкую строку?
gkns
5
Я не могу сказать, сколько раз я гуглил и копировал этот точный ответ, но он будет двузначным
MightyPork
1
Первый «STR_HELPER» является обязательным, потому что «#» работает только с аргументом макроса. Мне потребовалось время, чтобы понять это ..
clarkttfu
1
@clarkttfu, вроде - да, #работает только с макро-аргументами. Однако STR_HELPERмакрос необходим, чтобы избежать превращения макроса MAJOR_VERв строку "MAJOR_VAR", в которой мы хотим получить результат "2".
Lindydancer
13

Рабочий способ - написать MY_FILE как параметрический макрос:

РЕДАКТИРОВАТЬ: Как отмечает «Lindydancer», это решение не расширяет макросы в аргументах. Более общее решение:

Джузеппе Геррини
источник
1
На мой взгляд, это лучший ответ, и он намного проще, чем другие предложения. Я удивлен, что рейтинг не стал лучше!
osirisgothra
5
Это чистое решение, которое, к сожалению, не работает. Если переданный аргумент - MY_FILEэто макрос, скажем Aи B, этот макрос будет расширен до "/home..." "A" "B".
Lindydancer 02
2

Вы можете сделать это с помощью BOOST_PP_STRINGIZE :

Максим Егорушкин
источник
29
Меня заставляет ухмыльнуться, как люди бросают Boost на все.
Frerich Raabe
4
@Frerich: Доводя ваши аргументы до крайности, люди должны сначала писать свои собственные компиляторы в сыром машинном коде, а не бросать g ++ во все ... Нет смысла изобретать велосипед. Хорошие программисты пишут код, а отличные - повторно.
Максим Егорушкин
@jonescb: просто откройте заголовок повышения и убедитесь сами.
Максим Егорушкин
11
Ага, я пробовал. Это действительно сработало, но использование заголовка Boost в программе на C мне кажется странным.
jonescb
1
Ой, моя беда, Cметку не заметил .
Максим Егорушкин