80 votes

Préprocesseur C: concaténer int en string

Je suis à essayer de comprendre comment je peux concaténer une #define'd int #define'd chaîne à l'aide du Préprocesseur C. Mon compilateur est GCC 4.1 sur CentOS 5. La solution devrait également fonctionner pour MinGW.

J'aimerais ajouter un numéro de version sur une chaîne, mais la seule façon que je peux l'obtenir pour fonctionner est de faire une copie du numéro de la version définit comme des chaînes de caractères.

La chose la plus proche que j'ai pu trouver est une méthode de citer les arguments de la macro, mais il ne fonctionne pas pour #defines

C'est 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 l' #s, soit parce que les valeurs sont des nombres, et il serait étendre à d' "/home/user/.myapp" 2 6, ce qui n'est pas valide C.

Cela fonctionne, mais je n'aime pas avoir des copies de la version définit parce que j'ai besoin d'eux comme des numéros.

#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

148voto

Lindydancer Points 13353

Classique du préprocesseur C question....

#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)

Le niveau supplémentaire d'indirection permettra le préprocesseur pour développer les macros avant qu'ils ne soient convertis en chaînes.

10voto

Giuseppe Guerrini Points 2270

Une façon de travailler est d'écrire MY_FILE comme une représentation paramétrique de la macro:

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

EDIT: Comme l'a noté "Lindydancer", cette solution n'est pas de développer des macros dans les arguments. Un plus solution générale est:

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

2voto

Maxim Yegorushkin Points 29380

Vous pouvez le faire avec 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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X