Istnieje kilka sposobów, aby to zrobić:
jeśli masz do czynienia z zaledwie napisowych, można po prostu użyć po prostu użyć ciągi - umieszczenie jeden ciąg dosłowne po drugim powoduje kompilator je złączyć .
czy mogą istnieć inne rzeczy niż napisowych zaangażowanych (tj., Tworzysz nowe identyfikatory z makrami) używać '##
"tokenu preprocesora operatora tapetowania. Wy pewnie też trzeba użyć«#
» „stringizing operatorowi dokonać makra do dosłownych ciągów
przykładem # 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
I o ile token operator wklejanie idzie, nie sądzę, że większość odpowiedzi, które sugerują z użyciem procesora wklejającego token wypróbował go - może być trudny w użyciu.
Korzystanie odpowiedź, która jest często sugerowane spowoduje błąd kompilatora podczas próby korzystania z IV_SECURE
makro, ponieważ:
#define IV_SECURE "secure."##IV_DOMAIN
rozszerza się:
"secure"domain.org
Możecie spróbować używać operatora naciągania '
# '' 'stringizing':
#define IV_SECURE "secure." #IV_DOMAIN
Ale tha t nie działa, ponieważ działa tylko na argumentach makr - nie tylko na starym makrze.
Należy pamiętać o tym, że podczas korzystania z operatorów przetwarzania wstępnego token-paste ('##') lub szeregowych ('#') konieczne jest stosowanie dodatkowego poziomu niezależności, aby działały poprawnie we wszystkich przypadkach.
Jeśli tego nie zrobi i przedmioty przekazywane do operatora token-wklejania są makra się, dostaniesz wyniki, które są prawdopodobnie nie co chcesz:
#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__)));
}
Wyjście:
buggy results:
SOME_MACRO__LINE__
BAD_PASTE(SOME_MACRO, __LINE__)
PASTE(SOME_MACRO, __LINE__)
desired result:
function_name21
Więc używając oryginalnych IV_DOMAIN
definiuje i makr utilty z góry, można to zrobić, aby uzyskać to, co chcesz:
// Sub-Domain
#define IV_SECURE "secure." STRINGIFY(IV_DOMAIN) //secure.domain.org etc
#define IV_MOBILE "m." STRINGIFY(IV_DOMAIN)
Możliwy duplikat [Konwersja tokena preprocesora na ciąg] (http://stackoverflow.com/questions/240353/convert-a-procesor -token-a-string) –