(Der Standard Haftungsausschluss etwa nicht das C-Präprozessor ohne einen wirklich guten Grund zu missbrauchen gilt auch hier.)
Es ist sicherlich möglich zu tun, was Sie tun mögen. Sie benötigen ein STRINGIFY
Makro und ein bisschen Makroindirektion.
In der Regel ist STRINGIFY
mit einer Dereferenzierungsebene definiert, damit der C-Präprozessor seine Argumente erweitern kann, bevor sie einer Zeichenfolge unterzogen werden. Eine Implementierung ist:
/* The # operator converts symbol 'v' into a string */
#define STRINGIFY0(v) #v
#define STRINGIFY(v) STRINGIFY0(v)
aber Sie werden feststellen, dass dies nicht genug ist:
#define _ACD 5, 5, 5, 30
#define DEFAULT_NETWORK_TOKEN_KEY_CLASS _ACD
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS }
#define START_MSG STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)
const char startMsg[] = START_MSG;
Hier STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)
zu STRINGIFY0(5,5,5,30)
erweitert, und der C-Präprozessor beklagt, dass Sie STRINGIFY0
auch gegeben haben viele Argumente.
Die Lösung ist, die Erweiterung von _ACD
zu verzögern, so dass es nur auf 5,5,5,30
erweitert wird, wenn Sie es möchten. Dazu definieren sie als funktionsähnliche Makro:
#define _ACD() 5, 5, 5, 30
Auf diese Weise _ACD
wird nur erweitert werden, wenn Sie „Anruf“ es: _ACD()
. DEFAULT_NETWORK_TOKEN_KEY_CLASS
wird jetzt auf _ACD
erweitert, und Sie müssen es erweitern, indem Sie es "aufrufen": DEFAULT_NETWORK_TOKEN_KEY_CLASS()
.
Der folgende Code zeigt die Lösung:
#include <stdio.h>
#define STRINGIFY0(v) #v
#define STRINGIFY(v) STRINGIFY0(v)
#define _ACD() 5, 5, 5, 30
#define DEFAULT_NETWORK_TOKEN_KEY_CLASS _ACD
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS() }
#define START_MSG STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)
const char startMsg[] = START_MSG;
int main(int argc, char** argv)
{
printf("%s\n",startMsg);
return 0;
}
Ich denke, es ist nicht möglich. Aber ich weiß, dass nichts unmöglich ist. Jeder? – Rick2047