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

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

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

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

    Рабочим способом является запись MY_FILE в качестве параметрического макроса:

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

    EDIT: Как отметил «Lindydancer», это решение не расширяет macros в аргументах. Более общее решение:

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

    Вы можете сделать это с помощью 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) 
    Давайте будем гением компьютера.