Saya mencoba untuk mencari tahu bagaimana saya bisa menggabungkan #define
'd int ke #define
' d string menggunakan C Preprocessor. Kompiler saya adalah GCC 4.1 di CentOS 5. Solusinya juga harus berfungsi untuk MinGW.
Saya ingin menambahkan nomor versi ke string, tetapi satu-satunya cara agar saya dapat berfungsi adalah membuat salinan nomor versi yang didefinisikan sebagai string.
Hal terdekat yang bisa saya temukan adalah metode mengutip argumen makro, tetapi tidak berhasil untuk #define
s
Ini tidak berhasil.
#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER
Itu tidak bekerja tanpa #
s juga karena nilainya adalah angka dan akan berkembang menjadi "/home/user/.myapp" 2 6
, yang bukan C yang valid .
Ini berfungsi, tetapi saya tidak suka memiliki salinan dari versi yang ditentukan karena saya membutuhkannya sebagai angka juga.
#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
sumber
Jawaban:
Pertanyaan klasik C preprocessor ....
#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)
Tingkat tipuan ekstra akan memungkinkan preprocessor untuk memperluas makro sebelum diubah menjadi string.
sumber
#
hanya berfungsi dengan argumen makro. Namun,STR_HELPER
makro diperlukan untuk menghindari mengubah makroMAJOR_VER
menjadi string"MAJOR_VAR"
, di mana kita ingin mendapatkan hasilnya"2"
.Cara kerjanya adalah dengan menulis MY_FILE sebagai makro parametrik:
#define MY_FILE(x,y) "/home..." #x #y
EDIT: Seperti dicatat oleh "Lindydancer", solusi ini tidak memperluas makro dalam argumen. Solusi yang lebih umum adalah:
#define MY_FILE_(x,y) "/home..." #x #y #define MY_FILE(x,y) MY_FILE_(x,y)
sumber
MY_FILE
adalah makro, katakanA
danB
, makro ini akan diperluas menjadi"/home..." "A" "B"
.Anda dapat melakukannya dengan 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)
sumber
C
tag.