J'essaie de comprendre comment je peux concaténer un #define
'd int à une #define
' d string en utilisant le préprocesseur C. Mon compilateur est GCC 4.1 sur CentOS 5. La solution devrait également fonctionner pour MinGW.
Je voudrais ajouter un numéro de version à une chaîne, mais la seule façon de le faire fonctionner est de faire une copie du numéro de version défini comme des chaînes.
La chose la plus proche que j'ai pu trouver était une méthode pour citer des arguments de macro, mais cela ne fonctionne pas pour #define
s
Cela ne fonctionne pas.
#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER
Il ne fonctionne pas sans #
s soit parce que les valeurs sont des nombres et il se développerait à "/home/user/.myapp" 2 6
, ce qui est valide C .
Cela fonctionne, mais je n'aime pas avoir des copies des définitions de version parce que j'en ai également besoin en tant que nombres.
#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
la source
Réponses:
Question préprocesseur classique C ...
Le niveau supplémentaire d'indirection permettra au préprocesseur d'étendre les macros avant qu'elles ne soient converties en chaînes.
la source
#
ne fonctionne qu'avec des arguments de macro. Cependant, laSTR_HELPER
macro est nécessaire pour éviter de transformer la macroMAJOR_VER
en chaîne"MAJOR_VAR"
, là où nous voulons que le résultat soit"2"
.Une méthode de travail consiste à écrire MY_FILE en tant que macro paramétrique:
EDIT: Comme indiqué par "Lindydancer", cette solution ne développe pas les macros dans les arguments. Une solution plus générale est:
la source
MY_FILE
sont des macros, disonsA
etB
, cette macro se développera en"/home..." "A" "B"
.Vous pouvez le faire avec BOOST_PP_STRINGIZE :
la source
C
balise.