Объединить int в строку с помощью препроцессора C - PullRequest
78 голосов
/ 28 марта 2011

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

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

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

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

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER

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

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

#define MAJOR_VER 2
#define MINOR_VER 6
#define MAJOR_VER_STR "2"
#define MINOR_VER_STR "6"
#define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING

Ответы [ 3 ]

138 голосов
/ 28 марта 2011

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

#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER)

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

10 голосов
/ 28 марта 2011

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

#define MY_FILE(x,y) "/home..." #x #y

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

#define MY_FILE_(x,y) "/home..." #x #y
#define MY_FILE(x,y) MY_FILE_(x,y)
2 голосов
/ 28 марта 2011

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

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" BOOST_PP_STRINGIZE(MAJOR_VER) BOOST_PP_STRINGIZE(MINOR_VER)
...