Il y a deux manières de le faire:
si vous avez affaire à seulement littéraux de chaîne, vous pouvez simplement utiliser il suffit d'utiliser des chaînes - placer une chaîne littérale après l'autre au compilateur de les concaténer .
s'il peut y avoir d'autres choses que des chaînes littérales impliqués (ie., Vous créez de nouveaux identifiants des macros) utilisent le '##
"opérateur de coller jeton préprocesseur. Vous auriez probablement besoin aussi d'utiliser le « #
» « opérateur stringizing pour faire vos macros dans les chaînes littérales
Un exemple de # 1:.
#ifdef __TESTING
#define IV_DOMAIN "domain.org" //in house testing
#elif __LIVE_TESTING
#define IV_DOMAIN "test.domain.com" //live testing servers
#else
#define IV_DOMAIN "domain.com" //production
#endif
// Sub-Domain
#define IV_SECURE "secure." IV_DOMAIN //secure.domain.org etc
#define IV_MOBILE "m." IV_DOMAIN
Et pour autant que l'opérateur de coller jeton va, je ne pense pas que la plupart des réponses qui suggèrent L'utilisation de l'opérateur de préprocesseur de collage de jetons l'a effectivement essayé - il peut être difficile à utiliser.
En utilisant la réponse qui est souvent proposé entraînera une erreur de compilation lorsque vous essayez d'utiliser la IV_SECURE
macro, parce que:
#define IV_SECURE "secure."##IV_DOMAIN
étend à:
"secure"domain.org
Vous pouvez essayer d'utiliser le '
# ` » opérateur 'stringizing':
#define IV_SECURE "secure." #IV_DOMAIN
Mais tha Cela ne fonctionnera pas car cela ne fonctionne que sur des arguments de macro - pas n'importe quelle vieille macro. Une chose à savoir lorsque vous utilisez les opérateurs de pré-traitement token-paste ('##') ou de stringizing ('#') est que vous devez utiliser un niveau supplémentaire d'indirection pour qu'ils fonctionnent correctement dans tous les cas.
Si vous ne le faites pas et les éléments transmis à l'opérateur-coller de jeton sont eux-mêmes des macros, vous obtiendrez des résultats qui ne sont probablement pas ce que vous voulez:
#include <stdio.h>
#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2(a, b) a##b
#define PASTE(a, b) PASTE2(a, b)
#define BAD_PASTE(x,y) x##y
#define BAD_STRINGIFY(x) #x
#define SOME_MACRO function_name
int main()
{
printf("buggy results:\n");
printf("%s\n", STRINGIFY(BAD_PASTE(SOME_MACRO, __LINE__)));
printf("%s\n", BAD_STRINGIFY(BAD_PASTE(SOME_MACRO, __LINE__)));
printf("%s\n", BAD_STRINGIFY(PASTE(SOME_MACRO, __LINE__)));
printf("\n" "desired result:\n");
printf("%s\n", STRINGIFY(PASTE(SOME_MACRO, __LINE__)));
}
La sortie:
buggy results:
SOME_MACRO__LINE__
BAD_PASTE(SOME_MACRO, __LINE__)
PASTE(SOME_MACRO, __LINE__)
desired result:
function_name21
donc, en utilisant votre IV_DOMAIN
d'origine et les macros définit de utilty d'en haut, vous pouvez le faire pour obtenir ce que vous voulez:
// Sub-Domain
#define IV_SECURE "secure." STRINGIFY(IV_DOMAIN) //secure.domain.org etc
#define IV_MOBILE "m." STRINGIFY(IV_DOMAIN)
Possible dupliquer de [Convertir un jeton de préprocesseur en chaîne] (http://stackoverflow.com/questions/240353/convert-a-preprocessor -token-to-a-string) –