Подтвердить что ты не робот

C Препроцессор: конкатенировать int для строки

Я пытаюсь выяснить, как я могу объединить #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

Он не работает без # либо потому, что значения являются числами, и он будет расширяться до "/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
4b9b3361

Ответ 1

Вопрос о препроцессоре классического 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)

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

Ответ 2

Рабочим способом является запись 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)

Ответ 3

Вы можете сделать это с помощью 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)