2017-02-02 2 views
1

Der folgende Code gibt Fehler:Token Verkettung mit ## gibt "keine gültige Vorverarbeitung Token"

"Einfügen "f32_Q31" und "(" geben keine gültige Vorverarbeitung Token"

#define INIT_Q(N, name, val) \ 
    name.value = f32_Q##N##(val); 

#define f32_Q31(x)  f32_Q(31,x) 
INIT_Q31(name, val)  INIT_Q(31, name, val) 
INIT_Q25(name, val)  INIT_Q(25, name, val) 

kann man das beheben?

+1

Hast du zufällig bedeuten 'name.value = f32_Q ## N (val); '? Die obige Version ergibt für mich keinen Sinn. – Ctx

+0

Geändert, siehe unten. – Danijel

+2

@Danijel: du scheinst '' define'' zu Beginn der letzten zwei Zeilen vergessen zu haben. –

Antwort

3

Da f32_Q31( kein einziges Token ist, sondern zwei. der ( ist ein Zeichen an und für sich. Das Ergebnis der Verkettung muss ein Einzel gültiges Token sein.

Wenn Ihre Absicht ist name.value mit der Erweiterung eines anderen Makro zu initialisieren, wird folgendes tun:

#define INIT_Q(N, name, val) \ 
    name.value = f32_Q##N(val); 

Der Makroname ist, was ein gültiges Token sein muss, nicht der ganze Ausdruck.


Als Sander De Dycker wies darauf hin, Sie scheinen auch die define aus Ihrem letzten zwei Makrodefinitionen weggelassen zu haben:

#define INIT_Q31(name, val)  INIT_Q(31, name, val) 
#define INIT_Q25(name, val)  INIT_Q(25, name, val) 
+0

hat es geändert. Jetzt zeigt es auf INIT_Q31 (und sagt: "erwartete Konstruktor, Destruktor oder Typ Konvertierung vor '(' Token". – Danijel

+1

@Danijel - Wenn Ihr Code auf nur das erwähnte Problem reduziert ist, ist es gelöst (http://ideone.com/zJTK2o). Wenn Sie ein anderes Problem haben, ist es nicht in dem, was Sie gezeigt haben oder in Verbindung mit meinem Reparaturvorschlag.Das Update erlaubte nur dem Compiler, über das nächste Problem zu stolpern. – StoryTeller

+1

@Danijel Kennt Ihr C-Compiler über Konstruktoren und Destruktoren "Das ist ziemlich ungewöhnlich. Vielleicht verwenden Sie eine andere Sprache mit einem Namen, der den Großbuchstaben C? –