Es gibt ein paar Möglichkeiten, dies zu tun:
, wenn Sie mit nur Stringliterale zu tun sind, können Sie einfach und unkompliziert Strings verwenden - Platzierung einer Stringliteral nach dem anderen den Compiler bewirkt, dass sie verketten .
, wenn es andere Dinge involviert als Zeichenfolgenliterale sein kann (dh., Sie neue Kennungen von den Makros erstellen) die Verwendung '##
"Präprozessor token einfügen Operator. Sie würden wahrscheinlich müssen auch die Verwendung‚#
‘ ‚Zeichenfolgen Operator Ihre Makros in Literalzeichenfolgen machen
Ein Beispiel # 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
Und so weit das token einfügen Operator geht, ich glaube nicht, dass die meisten der Antworten, die vorschlagen ted mit dem Token-Pasting-Präprozessor-Operator haben es tatsächlich versucht - es kann schwierig zu bedienen sein.
Mit der Antwort, die oft vorgeschlagen wird, in einem Compiler-Fehler führen wird, wenn Sie das IV_SECURE
Makro zu verwenden versuchen, denn:
#define IV_SECURE "secure."##IV_DOMAIN
expandiert nach:
"secure"domain.org
Sie könnten versuchen wollen die '
# `‘ 'Zeichenfolge' Operator zu verwenden:
#define IV_SECURE "secure." #IV_DOMAIN
Aber tha t funktioniert nicht, weil es nur für Makroargumente funktioniert - nicht nur für ein altes Makro.
Wenn Sie die Vorverarbeitungsoperatoren token-paste ('##') oder Stringing ('#') verwenden, müssen Sie eine zusätzliche Indirektionsebene verwenden, damit sie ordnungsgemäß funktionieren auf alle Fälle.
Wenn Sie dies nicht tun und die Elemente auf dem Token-Einfügen-Operator übergeben sind Makros selbst, werden Sie Ergebnisse, die wahrscheinlich nicht das, was Sie wollen:
#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__)));
}
Der Ausgang:
buggy results:
SOME_MACRO__LINE__
BAD_PASTE(SOME_MACRO, __LINE__)
PASTE(SOME_MACRO, __LINE__)
desired result:
function_name21
das bekommen, was Sie wollen, Sie könnten also von oben ursprünglichen IV_DOMAIN
definiert und die utilty Makros tun:
// Sub-Domain
#define IV_SECURE "secure." STRINGIFY(IV_DOMAIN) //secure.domain.org etc
#define IV_MOBILE "m." STRINGIFY(IV_DOMAIN)
Mögliches Duplikat von [Konvertiere ein Präprozessor-Token in einen String] (http://stackoverflow.com/questions/240353/convert-a-preprocessor -token-to-a-string) –