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


91

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

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

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

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

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

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


Ответы:


173

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

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


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метку не заметил .
Максим Егорушкин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.