Próbuję dowiedzieć się, jak mogę połączyć #define
„d int z #define
ciągiem” za pomocą preprocesora C. Mój kompilator to GCC 4.1 na CentOS 5. Rozwiązanie powinno również działać dla MinGW.
Chciałbym dołączyć numer wersji do łańcucha, ale jedynym sposobem, w jaki mogę go uruchomić, jest zrobienie kopii numeru wersji zdefiniowanego jako ciągi.
Najbliższą rzeczą, jaką udało mi się znaleźć, była metoda cytowania argumentów makr, ale nie działa ona w przypadku #define
s
To nie działa.
#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER
To nie działa bez #
s albo ponieważ wartości są liczbami i byłoby rozszerzyć do "/home/user/.myapp" 2 6
, który nie jest ważny C .
To działa, ale nie lubię mieć kopii definicji wersji, ponieważ potrzebuję ich również jako liczb.
#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
źródło
źródło
Odpowiedzi:
Pytanie dotyczące klasycznego preprocesora 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)
Dodatkowy poziom pośrednictwa pozwoli preprocesorowi rozwinąć makra, zanim zostaną przekształcone w łańcuchy.
źródło
#
działa tylko z argumentami makr. JednakSTR_HELPER
makro jest potrzebne, aby uniknąć zamiany makraMAJOR_VER
na łańcuch"MAJOR_VAR"
, gdzie chcemy, aby wynik był"2"
.Działającym sposobem jest zapisanie MOJ_PLIK jako makra parametrycznego:
#define MY_FILE(x,y) "/home..." #x #y
EDYCJA: Jak zauważył „Lindydancer”, to rozwiązanie nie rozszerza makr w argumentach. Bardziej ogólnym rozwiązaniem jest:
#define MY_FILE_(x,y) "/home..." #x #y #define MY_FILE(x,y) MY_FILE_(x,y)
źródło
MY_FILE
to makra, powiedzmyA
iB
, to makro rozwinie się do"/home..." "A" "B"
.Możesz to zrobić za pomocą 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)
źródło
C
tagu.