2016-08-01 10 views
0

Ich habe das folgende Stück Code, und ich möchte programmatisch die Felder der Struktur zuzugreifen:Warum Token-Verkettung in C++ nicht funktioniert?

#include <stdio.h> 
#include <stddef.h> 

#define FIELD(NAME, NUM) {NAME##NUM} 


struct SFOO 
{ 
    int i; 
    float f1; 
    float f2; 
    char c; 
}; 

int main() { 
    printf("Offset of 'f1' is %u", offsetof(SFOO, f1)); 
    printf("Offset of 'f1' is %u", offsetof(SFOO, FIELD(f, 1))); 
} 

Die erste Zeile in main() funktioniert, aber die zweite Zeile nicht kompiliert (MSVC 2012). Wie kann ich den Feldnamen mithilfe der Token-Verkettung generieren?

+6

Warum Sie die geschweiften Klammern brauchen ('{}') in der Definition von 'Feld'? – jxh

+2

Das 'FIELD'-Makro in der zweiten Zeile erzeugt nicht die gleiche Ausgabe wie die erste Zeile. – callyalater

+0

Entfernen Sie die Klammern '{}'? – Galik

Antwort

3

Entfernen Sie die { und } in Ihrer Definition von FIELD.

#define FIELD(NAME, NUM) NAME##NUM 

Mit Ihrer vorherigen Definition, Ihre print-Anweisung in etwas erweitern würde, dass die offsetof Makro wird nicht akzeptieren:

printf("Offset of 'f1' is %u", offsetof(SFOO, {f1}));