2012-07-27 9 views
7

Aus Interesse:Makroexpansion und Stringifizierung: Wie erhält man den Makronamen (nicht seinen Wert) mit einem anderen Makro?

#define _ACD 5, 5, 5, 30 

#define DEFAULT_NETWORK_TOKEN_KEY_CLASS _ACD 

#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS } 

DEFAULT_NETWORK_TOKEN_KEY_CLASS Mit Makro nur, wie _ACD in einem const unsigned char Zeichenfolge zu bekommen [].

const uint8 startMsg[] = ?? DEFAULT_NETWORK_TOKEN_KEY_CLASS ; 

Wird _ACD nur zur Folge haben.

Was wird die richtige Makroerweiterung sein, um _ACD hier zu bekommen. Im Rahmen des How to stringify macro having array as #define a_macro {5,7,7,97}?

+1

Ich denke, es ist nicht möglich. Aber ich weiß, dass nichts unmöglich ist. Jeder? – Rick2047

Antwort

7

(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; 
} 
+0

Perfekte Antwort. Gibt den ** _ ADC ** aus. Ich habe heute viel gelernt. Vielen Dank – Rick2047

Verwandte Themen