Я пытаюсь понять, как я могу объединить #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
c
c-preprocessor
stringification
Jonescb
источник
источник
Ответы:
Классический вопрос о препроцессоре 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)
Дополнительный уровень косвенного обращения позволит препроцессору раскрыть макросы до их преобразования в строки.
источник
#
работает только с макро-аргументами. ОднакоSTR_HELPER
макрос необходим, чтобы избежать превращения макросаMAJOR_VER
в строку"MAJOR_VAR"
, в которой мы хотим получить результат"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)
источник
MY_FILE
это макрос, скажемA
иB
, этот макрос будет расширен до"/home..." "A" "B"
.Вы можете сделать это с помощью 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)
источник
C
метку не заметил .